@mcp-z/mcp-gmail 1.0.9 → 1.0.11
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/constants.js.map +1 -1
- package/dist/cjs/email/composition/rfc822-builder.js.map +1 -1
- package/dist/cjs/email/messages/fetch-message.js +15 -21
- package/dist/cjs/email/messages/fetch-message.js.map +1 -1
- package/dist/cjs/email/messages/messages.js +2 -2
- package/dist/cjs/email/messages/messages.js.map +1 -1
- package/dist/cjs/email/parsing/header-parsing.js.map +1 -1
- package/dist/cjs/email/parsing/headers-utils.js.map +1 -1
- package/dist/cjs/email/parsing/html-processing.js.map +1 -1
- package/dist/cjs/email/parsing/message-extraction.js.map +1 -1
- package/dist/cjs/email/querying/execute-query.js +7 -14
- package/dist/cjs/email/querying/execute-query.js.map +1 -1
- package/dist/cjs/email/querying/pagination.js +19 -24
- package/dist/cjs/email/querying/pagination.js.map +1 -1
- package/dist/cjs/email/querying/query-builder.js +4 -2
- package/dist/cjs/email/querying/query-builder.js.map +1 -1
- package/dist/cjs/email/querying/search-execution.js +2 -5
- package/dist/cjs/email/querying/search-execution.js.map +1 -1
- package/dist/cjs/index.js +10 -24
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/labels/gmail-labels.js +2 -5
- package/dist/cjs/labels/gmail-labels.js.map +1 -1
- package/dist/cjs/lib/base64-encoding.js.map +1 -1
- package/dist/cjs/lib/create-store.js +2 -5
- package/dist/cjs/lib/create-store.js.map +1 -1
- package/dist/cjs/lib/date-conversion.js.map +1 -1
- package/dist/cjs/lib/messages-to-row.js +2 -2
- package/dist/cjs/lib/messages-to-row.js.map +1 -1
- package/dist/cjs/mcp/index.js +8 -19
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/draft-email.js +3 -6
- package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
- package/dist/cjs/mcp/prompts/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/query-syntax.js +3 -6
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/resources/email.js +3 -6
- package/dist/cjs/mcp/resources/email.js.map +1 -1
- package/dist/cjs/mcp/resources/index.js.map +1 -1
- package/dist/cjs/mcp/tools/categories-list.js +4 -8
- package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
- package/dist/cjs/mcp/tools/index.js.map +1 -1
- package/dist/cjs/mcp/tools/label-add.js +4 -8
- package/dist/cjs/mcp/tools/label-add.js.map +1 -1
- package/dist/cjs/mcp/tools/label-delete.d.cts +1 -1
- package/dist/cjs/mcp/tools/label-delete.d.ts +1 -1
- package/dist/cjs/mcp/tools/label-delete.js +36 -32
- package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
- package/dist/cjs/mcp/tools/labels-list.js +4 -8
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
- package/dist/cjs/mcp/tools/message-get.d.cts +21 -21
- package/dist/cjs/mcp/tools/message-get.d.ts +21 -21
- package/dist/cjs/mcp/tools/message-get.js +4 -8
- package/dist/cjs/mcp/tools/message-get.js.map +1 -1
- package/dist/cjs/mcp/tools/message-mark-read.js +4 -8
- package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.d.cts +1 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.d.ts +1 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.js +36 -32
- package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/message-respond.js +5 -11
- package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
- package/dist/cjs/mcp/tools/message-search.d.cts +25 -25
- package/dist/cjs/mcp/tools/message-search.d.ts +25 -25
- package/dist/cjs/mcp/tools/message-search.js +19 -25
- package/dist/cjs/mcp/tools/message-search.js.map +1 -1
- package/dist/cjs/mcp/tools/message-send.d.cts +3 -3
- package/dist/cjs/mcp/tools/message-send.d.ts +3 -3
- package/dist/cjs/mcp/tools/message-send.js +4 -8
- package/dist/cjs/mcp/tools/message-send.js.map +1 -1
- package/dist/cjs/mcp/tools/messages-export-csv.d.cts +2 -2
- package/dist/cjs/mcp/tools/messages-export-csv.d.ts +2 -2
- package/dist/cjs/mcp/tools/messages-export-csv.js +16 -22
- package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/cjs/schemas/gmail-query-schema.d.cts +2 -1
- package/dist/cjs/schemas/gmail-query-schema.d.ts +2 -1
- package/dist/cjs/schemas/gmail-query-schema.js +26 -30
- package/dist/cjs/schemas/gmail-query-schema.js.map +1 -1
- package/dist/cjs/schemas/index.js.map +1 -1
- package/dist/cjs/setup/config.js +11 -25
- package/dist/cjs/setup/config.js.map +1 -1
- package/dist/cjs/setup/http.js +15 -16
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/cjs/setup/index.js.map +1 -1
- package/dist/cjs/setup/oauth-google.js +9 -16
- package/dist/cjs/setup/oauth-google.js.map +1 -1
- package/dist/cjs/setup/runtime.d.cts +1 -1
- package/dist/cjs/setup/runtime.d.ts +1 -1
- package/dist/cjs/setup/runtime.js +29 -44
- package/dist/cjs/setup/runtime.js.map +1 -1
- package/dist/cjs/setup/stdio.js +15 -16
- package/dist/cjs/setup/stdio.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/email/composition/rfc822-builder.js.map +1 -1
- package/dist/esm/email/messages/fetch-message.js.map +1 -1
- package/dist/esm/email/messages/messages.js.map +1 -1
- package/dist/esm/email/parsing/header-parsing.js.map +1 -1
- package/dist/esm/email/parsing/headers-utils.js.map +1 -1
- package/dist/esm/email/parsing/html-processing.js.map +1 -1
- package/dist/esm/email/parsing/message-extraction.js.map +1 -1
- package/dist/esm/email/querying/execute-query.js.map +1 -1
- package/dist/esm/email/querying/pagination.js.map +1 -1
- package/dist/esm/email/querying/query-builder.js.map +1 -1
- package/dist/esm/email/querying/search-execution.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/labels/gmail-labels.js.map +1 -1
- package/dist/esm/lib/base64-encoding.js.map +1 -1
- package/dist/esm/lib/create-store.js.map +1 -1
- package/dist/esm/lib/date-conversion.js.map +1 -1
- package/dist/esm/lib/messages-to-row.js.map +1 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
- package/dist/esm/mcp/prompts/index.js.map +1 -1
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/esm/mcp/resources/email.js.map +1 -1
- package/dist/esm/mcp/resources/index.js.map +1 -1
- package/dist/esm/mcp/tools/categories-list.js.map +1 -1
- package/dist/esm/mcp/tools/index.js.map +1 -1
- package/dist/esm/mcp/tools/label-add.js.map +1 -1
- package/dist/esm/mcp/tools/label-delete.d.ts +1 -1
- package/dist/esm/mcp/tools/label-delete.js.map +1 -1
- package/dist/esm/mcp/tools/labels-list.js.map +1 -1
- package/dist/esm/mcp/tools/message-get.d.ts +21 -21
- package/dist/esm/mcp/tools/message-get.js.map +1 -1
- package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/esm/mcp/tools/message-move-to-trash.d.ts +1 -1
- package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/esm/mcp/tools/message-respond.js.map +1 -1
- package/dist/esm/mcp/tools/message-search.d.ts +25 -25
- package/dist/esm/mcp/tools/message-search.js +13 -12
- package/dist/esm/mcp/tools/message-search.js.map +1 -1
- package/dist/esm/mcp/tools/message-send.d.ts +3 -3
- package/dist/esm/mcp/tools/message-send.js.map +1 -1
- package/dist/esm/mcp/tools/messages-export-csv.d.ts +2 -2
- package/dist/esm/mcp/tools/messages-export-csv.js +9 -8
- package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/esm/schemas/gmail-query-schema.d.ts +2 -1
- package/dist/esm/schemas/gmail-query-schema.js +18 -21
- package/dist/esm/schemas/gmail-query-schema.js.map +1 -1
- package/dist/esm/schemas/index.js.map +1 -1
- package/dist/esm/setup/config.js.map +1 -1
- package/dist/esm/setup/http.js.map +1 -1
- package/dist/esm/setup/index.js.map +1 -1
- package/dist/esm/setup/oauth-google.js.map +1 -1
- package/dist/esm/setup/runtime.d.ts +1 -1
- package/dist/esm/setup/runtime.js.map +1 -1
- package/dist/esm/setup/stdio.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +11 -7
|
@@ -26,11 +26,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
26
26
|
reject(error);
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
-
if (info.done)
|
|
30
|
-
|
|
31
|
-
} else {
|
|
32
|
-
Promise.resolve(value).then(_next, _throw);
|
|
33
|
-
}
|
|
29
|
+
if (info.done) resolve(value);
|
|
30
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
34
31
|
}
|
|
35
32
|
function _async_to_generator(fn) {
|
|
36
33
|
return function() {
|
|
@@ -55,17 +52,14 @@ function _define_property(obj, key, value) {
|
|
|
55
52
|
configurable: true,
|
|
56
53
|
writable: true
|
|
57
54
|
});
|
|
58
|
-
} else
|
|
59
|
-
obj[key] = value;
|
|
60
|
-
}
|
|
55
|
+
} else obj[key] = value;
|
|
61
56
|
return obj;
|
|
62
57
|
}
|
|
63
58
|
function _instanceof(left, right) {
|
|
59
|
+
"@swc/helpers - instanceof";
|
|
64
60
|
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
65
61
|
return !!right[Symbol.hasInstance](left);
|
|
66
|
-
} else
|
|
67
|
-
return left instanceof right;
|
|
68
|
-
}
|
|
62
|
+
} else return left instanceof right;
|
|
69
63
|
}
|
|
70
64
|
function _object_spread(target) {
|
|
71
65
|
for(var i = 1; i < arguments.length; i++){
|
|
@@ -97,9 +91,8 @@ function ownKeys(object, enumerableOnly) {
|
|
|
97
91
|
}
|
|
98
92
|
function _object_spread_props(target, source) {
|
|
99
93
|
source = source != null ? source : {};
|
|
100
|
-
if (Object.getOwnPropertyDescriptors)
|
|
101
|
-
|
|
102
|
-
} else {
|
|
94
|
+
if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
95
|
+
else {
|
|
103
96
|
ownKeys(Object(source)).forEach(function(key) {
|
|
104
97
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
105
98
|
});
|
|
@@ -253,30 +246,31 @@ var config = {
|
|
|
253
246
|
};
|
|
254
247
|
function handler(_0, _1) {
|
|
255
248
|
return _async_to_generator(function(param, extra) {
|
|
256
|
-
var query, _param_pageSize, pageSize, pageToken, fields, _param_shape, shape, _param_contentType, contentType, _param_excludeThreadHistory, excludeThreadHistory, logger, requestedFields, includeBody, gmail, started, exec, items, metadata, durationMs, filteredItems, metadataObj, result, error, message;
|
|
249
|
+
var query, _param_pageSize, pageSize, pageToken, fields, _param_shape, shape, _param_contentType, contentType, _param_excludeThreadHistory, excludeThreadHistory, logger, parsedQuery, requestedFields, includeBody, gmail, started, exec, items, metadata, durationMs, filteredItems, metadataObj, result, error, message;
|
|
257
250
|
return _ts_generator(this, function(_state) {
|
|
258
251
|
switch(_state.label){
|
|
259
252
|
case 0:
|
|
260
253
|
query = param.query, _param_pageSize = param.pageSize, pageSize = _param_pageSize === void 0 ? _constantsts.DEFAULT_PAGE_SIZE : _param_pageSize, pageToken = param.pageToken, fields = param.fields, _param_shape = param.shape, shape = _param_shape === void 0 ? 'arrays' : _param_shape, _param_contentType = param.contentType, contentType = _param_contentType === void 0 ? 'text' : _param_contentType, _param_excludeThreadHistory = param.excludeThreadHistory, excludeThreadHistory = _param_excludeThreadHistory === void 0 ? false : _param_excludeThreadHistory;
|
|
261
254
|
logger = extra.logger;
|
|
255
|
+
_state.label = 1;
|
|
256
|
+
case 1:
|
|
257
|
+
_state.trys.push([
|
|
258
|
+
1,
|
|
259
|
+
3,
|
|
260
|
+
,
|
|
261
|
+
4
|
|
262
|
+
]);
|
|
263
|
+
parsedQuery = (0, _gmailqueryschemats.parseGmailQueryParameter)(query);
|
|
262
264
|
requestedFields = (0, _server.parseFields)(fields, _email.EMAIL_FIELDS);
|
|
263
265
|
includeBody = requestedFields === 'all' || requestedFields.has('body');
|
|
264
266
|
logger.info('gmail.message.search called', {
|
|
265
|
-
query:
|
|
267
|
+
query: parsedQuery,
|
|
266
268
|
pageSize: pageSize,
|
|
267
269
|
pageToken: pageToken ? '[provided]' : undefined,
|
|
268
270
|
fields: fields,
|
|
269
271
|
includeBody: includeBody,
|
|
270
272
|
accountId: extra.authContext.accountId
|
|
271
273
|
});
|
|
272
|
-
_state.label = 1;
|
|
273
|
-
case 1:
|
|
274
|
-
_state.trys.push([
|
|
275
|
-
1,
|
|
276
|
-
3,
|
|
277
|
-
,
|
|
278
|
-
4
|
|
279
|
-
]);
|
|
280
274
|
gmail = _googleapis.google.gmail({
|
|
281
275
|
version: 'v1',
|
|
282
276
|
auth: extra.authContext.auth
|
|
@@ -284,7 +278,7 @@ function handler(_0, _1) {
|
|
|
284
278
|
started = Date.now();
|
|
285
279
|
return [
|
|
286
280
|
4,
|
|
287
|
-
(0, _executequeryts.executeQuery)(
|
|
281
|
+
(0, _executequeryts.executeQuery)(parsedQuery, _object_spread_props(_object_spread({
|
|
288
282
|
client: gmail,
|
|
289
283
|
logger: logger,
|
|
290
284
|
pageSize: pageSize
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/mcp/tools/message-search.ts"],"sourcesContent":["import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\n/** Gmail message search using middleware-based auth pattern */\n\nimport { 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, createPaginationSchema, createShapeSchema, filterFields, parseFields, type ToolModule, toColumnarFormat } from '@mcp-z/server';\nimport { type gmail_v1, google } from 'googleapis';\nimport { z } from 'zod';\nimport { DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE } from '../../constants.ts';\nimport { extractBodyFromPayload } from '../../email/parsing/html-processing.ts';\nimport { executeQuery as executeGmailQuery } from '../../email/querying/execute-query.ts';\nimport { GmailQueryParameterSchema } from '../../schemas/gmail-query-schema.ts';\n\nconst inputSchema = z.object({\n query: GmailQueryParameterSchema.optional().describe('Structured query object or JSON string for filtering messages. Use query-syntax prompt for reference and rawGmailQuery for Gmail syntax.'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n ...createPaginationSchema({ defaultPageSize: DEFAULT_PAGE_SIZE, maxPageSize: MAX_PAGE_SIZE, provider: 'gmail' }).shape,\n shape: createShapeSchema(),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schemas for different shapes\nconst successObjectsBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('objects'),\n items: z.array(EmailDetailSchema).describe('Matching email messages'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\nconst successArraysBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('arrays'),\n columns: z.array(z.string()).describe('Column names in canonical order'),\n rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\n// Output schema with auth_required support\n// Using z.union instead of discriminatedUnion since we have two success branches with different shapes\nconst outputSchema = z.union([successObjectsBranchSchema, successArraysBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Search Gmail messages using structured query objects with flexible field selection.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ query, pageSize = DEFAULT_PAGE_SIZE, pageToken, fields, shape = 'arrays', contentType = 'text', excludeThreadHistory = false }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n const includeBody = requestedFields === 'all' || requestedFields.has('body');\n\n logger.info('gmail.message.search called', {\n query,\n pageSize,\n pageToken: pageToken ? '[provided]' : undefined,\n fields,\n includeBody,\n accountId: extra.authContext.accountId, // Available from middleware\n });\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n\n const started = Date.now();\n\n const exec = await executeGmailQuery(\n query,\n {\n client: gmail,\n logger,\n pageSize,\n ...(pageToken !== undefined && { pageToken }),\n includeBody,\n },\n (full: unknown) => {\n // Type-safe property access with guards\n const fullData = full as gmail_v1.Schema$Message;\n\n const headersArray = Array.isArray(fullData?.payload?.headers) ? fullData.payload.headers : [];\n const headers = 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 mapped: Partial<EmailDetail> = {\n id: String(fullData?.id ?? ''),\n threadId: fullData?.threadId ? String(fullData.threadId) : undefined,\n from: headers?.From,\n to: headers?.To,\n subject: headers?.Subject,\n date: headers?.Date,\n snippet: fullData?.snippet ? String(fullData.snippet) : undefined,\n };\n\n if (includeBody) {\n const payload = fullData?.payload;\n // Cast to Schema$MessagePart for extractBodyFromPayload\n const body = payload ? extractBodyFromPayload(payload as gmail_v1.Schema$MessagePart, { contentType, excludeThreadHistory }) : '';\n if (body) {\n mapped.body = body;\n mapped.bodyContentType = contentType;\n }\n }\n return mapped;\n }\n );\n\n const items = exec.items;\n const metadata = exec.metadata;\n const durationMs = Date.now() - started;\n\n // Type-safe field filtering\n const filteredItems = items.map((item) => filterFields(item, requestedFields));\n\n logger.info('gmail.message.search results', { query, pageSize, resultCount: filteredItems.length, fields: fields || 'all' });\n logger.info('gmail.message.search metrics', { durationMs, metadata });\n\n // Type-safe metadata access\n const metadataObj = metadata as { nextPageToken?: string } | undefined;\n\n // Build result based on shape\n const result: Output =\n shape === 'arrays'\n ? {\n type: 'success' as const,\n shape: 'arrays' as const,\n ...toColumnarFormat(filteredItems, requestedFields, EMAIL_FIELDS),\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\n }\n : {\n type: 'success' as const,\n shape: 'objects' as const,\n items: filteredItems,\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.message.search error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error searching messages: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-search',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","query","GmailQueryParameterSchema","optional","describe","fields","createFieldsSchema","availableFields","EMAIL_FIELDS","fieldDescriptions","EMAIL_FIELD_DESCRIPTIONS","commonPatterns","EMAIL_COMMON_PATTERNS","resourceName","createPaginationSchema","defaultPageSize","DEFAULT_PAGE_SIZE","maxPageSize","MAX_PAGE_SIZE","provider","shape","createShapeSchema","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successObjectsBranchSchema","type","literal","items","array","EmailDetailSchema","nextPageToken","string","successArraysBranchSchema","columns","rows","unknown","outputSchema","union","config","description","result","handler","extra","pageSize","pageToken","logger","requestedFields","includeBody","gmail","started","exec","metadata","durationMs","filteredItems","metadataObj","error","message","parseFields","has","info","undefined","accountId","authContext","google","version","auth","Date","now","executeGmailQuery","client","full","fullData","headersArray","Array","isArray","payload","headers","Object","fromEntries","map","h","header","String","name","value","mapped","id","threadId","from","From","to","To","subject","Subject","date","snippet","body","extractBodyFromPayload","bodyContentType","item","filterFields","resultCount","length","toColumnarFormat","content","text","JSON","stringify","structuredContent","Error","McpError","ErrorCode","InternalError","stack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-search.ts"],"sourcesContent":["import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\n/** Gmail message search using middleware-based auth pattern */\n\nimport { 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, createPaginationSchema, createShapeSchema, filterFields, parseFields, type ToolModule, toColumnarFormat } from '@mcp-z/server';\nimport { type gmail_v1, google } from 'googleapis';\nimport { z } from 'zod';\nimport { DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE } from '../../constants.ts';\nimport { extractBodyFromPayload } from '../../email/parsing/html-processing.ts';\nimport { executeQuery as executeGmailQuery } from '../../email/querying/execute-query.ts';\nimport { GmailQueryParameterSchema, parseGmailQueryParameter } from '../../schemas/gmail-query-schema.ts';\n\nconst inputSchema = z.object({\n query: GmailQueryParameterSchema.optional().describe('Structured query object or JSON string for filtering messages. Use query-syntax prompt for reference and rawGmailQuery for Gmail syntax.'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n ...createPaginationSchema({ defaultPageSize: DEFAULT_PAGE_SIZE, maxPageSize: MAX_PAGE_SIZE, provider: 'gmail' }).shape,\n shape: createShapeSchema(),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schemas for different shapes\nconst successObjectsBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('objects'),\n items: z.array(EmailDetailSchema).describe('Matching email messages'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\nconst successArraysBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('arrays'),\n columns: z.array(z.string()).describe('Column names in canonical order'),\n rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\n// Output schema with auth_required support\n// Using z.union instead of discriminatedUnion since we have two success branches with different shapes\nconst outputSchema = z.union([successObjectsBranchSchema, successArraysBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Search Gmail messages using structured query objects with flexible field selection.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ query, pageSize = DEFAULT_PAGE_SIZE, pageToken, fields, shape = 'arrays', contentType = 'text', excludeThreadHistory = false }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n\n try {\n const parsedQuery = parseGmailQueryParameter(query);\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n const includeBody = requestedFields === 'all' || requestedFields.has('body');\n\n logger.info('gmail.message.search called', {\n query: parsedQuery,\n pageSize,\n pageToken: pageToken ? '[provided]' : undefined,\n fields,\n includeBody,\n accountId: extra.authContext.accountId, // Available from middleware\n });\n\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n\n const started = Date.now();\n\n const exec = await executeGmailQuery(\n parsedQuery,\n {\n client: gmail,\n logger,\n pageSize,\n ...(pageToken !== undefined && { pageToken }),\n includeBody,\n },\n (full: unknown) => {\n // Type-safe property access with guards\n const fullData = full as gmail_v1.Schema$Message;\n\n const headersArray = Array.isArray(fullData?.payload?.headers) ? fullData.payload.headers : [];\n const headers = 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 mapped: Partial<EmailDetail> = {\n id: String(fullData?.id ?? ''),\n threadId: fullData?.threadId ? String(fullData.threadId) : undefined,\n from: headers?.From,\n to: headers?.To,\n subject: headers?.Subject,\n date: headers?.Date,\n snippet: fullData?.snippet ? String(fullData.snippet) : undefined,\n };\n\n if (includeBody) {\n const payload = fullData?.payload;\n // Cast to Schema$MessagePart for extractBodyFromPayload\n const body = payload ? extractBodyFromPayload(payload as gmail_v1.Schema$MessagePart, { contentType, excludeThreadHistory }) : '';\n if (body) {\n mapped.body = body;\n mapped.bodyContentType = contentType;\n }\n }\n return mapped;\n }\n );\n\n const items = exec.items;\n const metadata = exec.metadata;\n const durationMs = Date.now() - started;\n\n // Type-safe field filtering\n const filteredItems = items.map((item) => filterFields(item, requestedFields));\n\n logger.info('gmail.message.search results', { query, pageSize, resultCount: filteredItems.length, fields: fields || 'all' });\n logger.info('gmail.message.search metrics', { durationMs, metadata });\n\n // Type-safe metadata access\n const metadataObj = metadata as { nextPageToken?: string } | undefined;\n\n // Build result based on shape\n const result: Output =\n shape === 'arrays'\n ? {\n type: 'success' as const,\n shape: 'arrays' as const,\n ...toColumnarFormat(filteredItems, requestedFields, EMAIL_FIELDS),\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\n }\n : {\n type: 'success' as const,\n shape: 'objects' as const,\n items: filteredItems,\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.message.search error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error searching messages: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-search',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","query","GmailQueryParameterSchema","optional","describe","fields","createFieldsSchema","availableFields","EMAIL_FIELDS","fieldDescriptions","EMAIL_FIELD_DESCRIPTIONS","commonPatterns","EMAIL_COMMON_PATTERNS","resourceName","createPaginationSchema","defaultPageSize","DEFAULT_PAGE_SIZE","maxPageSize","MAX_PAGE_SIZE","provider","shape","createShapeSchema","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successObjectsBranchSchema","type","literal","items","array","EmailDetailSchema","nextPageToken","string","successArraysBranchSchema","columns","rows","unknown","outputSchema","union","config","description","result","handler","extra","pageSize","pageToken","logger","parsedQuery","requestedFields","includeBody","gmail","started","exec","metadata","durationMs","filteredItems","metadataObj","error","message","parseGmailQueryParameter","parseFields","has","info","undefined","accountId","authContext","google","version","auth","Date","now","executeGmailQuery","client","full","fullData","headersArray","Array","isArray","payload","headers","Object","fromEntries","map","h","header","String","name","value","mapped","id","threadId","from","From","to","To","subject","Subject","date","snippet","body","extractBodyFromPayload","bodyContentType","item","filterFields","resultCount","length","toColumnarFormat","content","text","JSON","stringify","structuredContent","Error","McpError","ErrorCode","InternalError","stack"],"mappings":"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"}
|
|
@@ -41,9 +41,9 @@ declare function handler(params: Input, extra: EnrichedExtra): Promise<{
|
|
|
41
41
|
id: string;
|
|
42
42
|
sentAt: string;
|
|
43
43
|
recipientCount: number;
|
|
44
|
-
threadId?: string;
|
|
45
|
-
webLink?: string;
|
|
46
|
-
size?: number;
|
|
44
|
+
threadId?: string | undefined;
|
|
45
|
+
webLink?: string | undefined;
|
|
46
|
+
size?: number | undefined;
|
|
47
47
|
};
|
|
48
48
|
};
|
|
49
49
|
};
|
|
@@ -41,9 +41,9 @@ declare function handler(params: Input, extra: EnrichedExtra): Promise<{
|
|
|
41
41
|
id: string;
|
|
42
42
|
sentAt: string;
|
|
43
43
|
recipientCount: number;
|
|
44
|
-
threadId?: string;
|
|
45
|
-
webLink?: string;
|
|
46
|
-
size?: number;
|
|
44
|
+
threadId?: string | undefined;
|
|
45
|
+
webLink?: string | undefined;
|
|
46
|
+
size?: number | undefined;
|
|
47
47
|
};
|
|
48
48
|
};
|
|
49
49
|
};
|
|
@@ -23,11 +23,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
23
23
|
reject(error);
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
|
-
if (info.done)
|
|
27
|
-
|
|
28
|
-
} else {
|
|
29
|
-
Promise.resolve(value).then(_next, _throw);
|
|
30
|
-
}
|
|
26
|
+
if (info.done) resolve(value);
|
|
27
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
31
28
|
}
|
|
32
29
|
function _async_to_generator(fn) {
|
|
33
30
|
return function() {
|
|
@@ -45,11 +42,10 @@ function _async_to_generator(fn) {
|
|
|
45
42
|
};
|
|
46
43
|
}
|
|
47
44
|
function _instanceof(left, right) {
|
|
45
|
+
"@swc/helpers - instanceof";
|
|
48
46
|
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
49
47
|
return !!right[Symbol.hasInstance](left);
|
|
50
|
-
} else
|
|
51
|
-
return left instanceof right;
|
|
52
|
-
}
|
|
48
|
+
} else return left instanceof right;
|
|
53
49
|
}
|
|
54
50
|
function _ts_generator(thisArg, body) {
|
|
55
51
|
var f, y, t, _ = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-send.ts"],"sourcesContent":["import { ComposeContentTypeSchema, createEmailRecipientsSchema, createMessageResultSchema } 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 type { ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { buildRfc822FromArgs } from '../../email/composition/rfc822-builder.ts';\nimport { b64url } from '../../lib/base64-encoding.ts';\n\nconst inputSchema = z.object({\n to: createEmailRecipientsSchema('to', true),\n cc: createEmailRecipientsSchema('cc', false),\n bcc: createEmailRecipientsSchema('bcc', false),\n subject: z.string().describe('Message subject').default(''),\n body: z.string().trim().min(1).describe('Email body content (plain text or HTML)'),\n contentType: ComposeContentTypeSchema,\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n item: createMessageResultSchema('gmail'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Send an email message through Gmail',\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(params: Input, extra: EnrichedExtra) {\n const { to, cc, bcc, subject, body, contentType } = params;\n const logger = extra.logger;\n logger.info('gmail.message.send called', { to, subject, contentType });\n\n if (!to) {\n throw new McpError(ErrorCode.InvalidParams, 'Missing required field: to');\n }\n\n try {\n // Build RFC822 message - only include optional headers when defined to satisfy\n // exactOptionalPropertyTypes (avoid passing `undefined` into optional props)\n const msgArgs: { to: string; cc?: string; bcc?: string; subject?: string; body: string; contentType: 'text' | 'html' } = { to, body, contentType };\n if (cc !== undefined) msgArgs.cc = cc;\n if (bcc !== undefined) msgArgs.bcc = bcc;\n if (subject !== undefined) msgArgs.subject = subject;\n\n const raw = buildRfc822FromArgs(msgArgs);\n const encodedMessage = b64url(raw);\n\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n\n const sendRes = await gmail.users.messages.send({\n userId: 'me',\n requestBody: { raw: encodedMessage },\n });\n const sendData = sendRes.data;\n const messageId = sendData.id || 'unknown';\n logger.info('Gmail: sent message successfully', { id: messageId });\n logger.info('gmail.message.send result (typed)', { to, subject, messageId });\n\n const totalRecipients = (Array.isArray(to) ? to.length : 1) + (cc ? (Array.isArray(cc) ? cc.length : 1) : 0) + (bcc ? (Array.isArray(bcc) ? bcc.length : 1) : 0);\n const result: Output = {\n type: 'success' as const,\n item: {\n id: messageId,\n sentAt: new Date().toISOString(),\n recipientCount: totalRecipients,\n webLink: `https://mail.google.com/mail/u/0/#sent/${messageId}`,\n },\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.send error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error sending message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-send',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","to","createEmailRecipientsSchema","cc","bcc","subject","string","describe","default","body","trim","min","contentType","ComposeContentTypeSchema","successBranchSchema","type","literal","item","createMessageResultSchema","outputSchema","discriminatedUnion","config","description","result","handler","params","extra","logger","msgArgs","raw","encodedMessage","gmail","sendRes","sendData","messageId","totalRecipients","error","message","info","McpError","ErrorCode","InvalidParams","undefined","buildRfc822FromArgs","b64url","google","version","auth","authContext","users","messages","send","userId","requestBody","data","id","Array","isArray","length","sentAt","Date","toISOString","recipientCount","webLink","content","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","name"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import type { EnrichedExtra } from '@mcp-z/oauth-google';
|
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import type { StorageExtra } from '../../types.js';
|
|
4
4
|
declare const inputSchema: z.ZodObject<{
|
|
5
|
-
query: z.ZodOptional<z.ZodType<import("../../types.js").GmailQuery, unknown, z.core.$ZodTypeInternals<import("../../types.js").GmailQuery, unknown>>>;
|
|
5
|
+
query: z.ZodOptional<z.ZodType<string | import("../../types.js").GmailQuery, unknown, z.core.$ZodTypeInternals<string | import("../../types.js").GmailQuery, unknown>>>;
|
|
6
6
|
maxItems: z.ZodDefault<z.ZodNumber>;
|
|
7
7
|
filename: z.ZodDefault<z.ZodString>;
|
|
8
8
|
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
@@ -55,7 +55,7 @@ export default function createTool(): {
|
|
|
55
55
|
config: {
|
|
56
56
|
readonly description: "Export Gmail messages to CSV with streaming pagination. Returns file URI. Use query-syntax prompt for query reference.";
|
|
57
57
|
readonly inputSchema: z.ZodObject<{
|
|
58
|
-
query: z.ZodOptional<z.ZodType<import("../../types.js").GmailQuery, unknown, z.core.$ZodTypeInternals<import("../../types.js").GmailQuery, unknown>>>;
|
|
58
|
+
query: z.ZodOptional<z.ZodType<string | import("../../types.js").GmailQuery, unknown, z.core.$ZodTypeInternals<string | import("../../types.js").GmailQuery, unknown>>>;
|
|
59
59
|
maxItems: z.ZodDefault<z.ZodNumber>;
|
|
60
60
|
filename: z.ZodDefault<z.ZodString>;
|
|
61
61
|
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
@@ -2,7 +2,7 @@ import type { EnrichedExtra } from '@mcp-z/oauth-google';
|
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import type { StorageExtra } from '../../types.js';
|
|
4
4
|
declare const inputSchema: z.ZodObject<{
|
|
5
|
-
query: z.ZodOptional<z.ZodType<import("../../types.js").GmailQuery, unknown, z.core.$ZodTypeInternals<import("../../types.js").GmailQuery, unknown>>>;
|
|
5
|
+
query: z.ZodOptional<z.ZodType<string | import("../../types.js").GmailQuery, unknown, z.core.$ZodTypeInternals<string | import("../../types.js").GmailQuery, unknown>>>;
|
|
6
6
|
maxItems: z.ZodDefault<z.ZodNumber>;
|
|
7
7
|
filename: z.ZodDefault<z.ZodString>;
|
|
8
8
|
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
@@ -55,7 +55,7 @@ export default function createTool(): {
|
|
|
55
55
|
config: {
|
|
56
56
|
readonly description: "Export Gmail messages to CSV with streaming pagination. Returns file URI. Use query-syntax prompt for query reference.";
|
|
57
57
|
readonly inputSchema: z.ZodObject<{
|
|
58
|
-
query: z.ZodOptional<z.ZodType<import("../../types.js").GmailQuery, unknown, z.core.$ZodTypeInternals<import("../../types.js").GmailQuery, unknown>>>;
|
|
58
|
+
query: z.ZodOptional<z.ZodType<string | import("../../types.js").GmailQuery, unknown, z.core.$ZodTypeInternals<string | import("../../types.js").GmailQuery, unknown>>>;
|
|
59
59
|
maxItems: z.ZodDefault<z.ZodNumber>;
|
|
60
60
|
filename: z.ZodDefault<z.ZodString>;
|
|
61
61
|
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
@@ -29,11 +29,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
29
29
|
reject(error);
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
|
-
if (info.done)
|
|
33
|
-
|
|
34
|
-
} else {
|
|
35
|
-
Promise.resolve(value).then(_next, _throw);
|
|
36
|
-
}
|
|
32
|
+
if (info.done) resolve(value);
|
|
33
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
37
34
|
}
|
|
38
35
|
function _async_to_generator(fn) {
|
|
39
36
|
return function() {
|
|
@@ -58,17 +55,14 @@ function _define_property(obj, key, value) {
|
|
|
58
55
|
configurable: true,
|
|
59
56
|
writable: true
|
|
60
57
|
});
|
|
61
|
-
} else
|
|
62
|
-
obj[key] = value;
|
|
63
|
-
}
|
|
58
|
+
} else obj[key] = value;
|
|
64
59
|
return obj;
|
|
65
60
|
}
|
|
66
61
|
function _instanceof(left, right) {
|
|
62
|
+
"@swc/helpers - instanceof";
|
|
67
63
|
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
68
64
|
return !!right[Symbol.hasInstance](left);
|
|
69
|
-
} else
|
|
70
|
-
return left instanceof right;
|
|
71
|
-
}
|
|
65
|
+
} else return left instanceof right;
|
|
72
66
|
}
|
|
73
67
|
function _object_spread(target) {
|
|
74
68
|
for(var i = 1; i < arguments.length; i++){
|
|
@@ -100,9 +94,8 @@ function ownKeys(object, enumerableOnly) {
|
|
|
100
94
|
}
|
|
101
95
|
function _object_spread_props(target, source) {
|
|
102
96
|
source = source != null ? source : {};
|
|
103
|
-
if (Object.getOwnPropertyDescriptors)
|
|
104
|
-
|
|
105
|
-
} else {
|
|
97
|
+
if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
98
|
+
else {
|
|
106
99
|
ownKeys(Object(source)).forEach(function(key) {
|
|
107
100
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
108
101
|
});
|
|
@@ -247,7 +240,7 @@ var config = {
|
|
|
247
240
|
* - NO RETRIES (fail fast on error)
|
|
248
241
|
*/ function handler(_0, _1) {
|
|
249
242
|
return _async_to_generator(function(param, extra) {
|
|
250
|
-
var query, maxItems, filename, contentType, excludeThreadHistory, logger, storageContext, transport, resourceStoreUri, baseUrl, reservation, storedName, fullPath, gmail, csvHeaders, writeStream, headerLine, totalRows, nextPageToken, started, _exec_metadata, remainingItems, pageSize, exec, csvRows, rowsContent, durationMs, truncated, uri, result, error, _cleanupError, message;
|
|
243
|
+
var query, maxItems, filename, contentType, excludeThreadHistory, logger, storageContext, transport, resourceStoreUri, baseUrl, reservation, storedName, fullPath, parsedQuery, gmail, csvHeaders, writeStream, headerLine, totalRows, nextPageToken, started, _exec_metadata, remainingItems, pageSize, exec, csvRows, rowsContent, durationMs, truncated, uri, result, error, _cleanupError, message;
|
|
251
244
|
return _ts_generator(this, function(_state) {
|
|
252
245
|
switch(_state.label){
|
|
253
246
|
case 0:
|
|
@@ -255,12 +248,6 @@ var config = {
|
|
|
255
248
|
logger = extra.logger;
|
|
256
249
|
storageContext = extra.storageContext;
|
|
257
250
|
transport = storageContext.transport, resourceStoreUri = storageContext.resourceStoreUri, baseUrl = storageContext.baseUrl;
|
|
258
|
-
logger.info('gmail.messages.export-csv called', {
|
|
259
|
-
query: query,
|
|
260
|
-
maxItems: maxItems,
|
|
261
|
-
filename: filename,
|
|
262
|
-
accountId: extra.authContext.accountId
|
|
263
|
-
});
|
|
264
251
|
return [
|
|
265
252
|
4,
|
|
266
253
|
(0, _server.reserveFile)(filename, {
|
|
@@ -282,6 +269,13 @@ var config = {
|
|
|
282
269
|
,
|
|
283
270
|
12
|
|
284
271
|
]);
|
|
272
|
+
parsedQuery = (0, _gmailqueryschemats.parseGmailQueryParameter)(query);
|
|
273
|
+
logger.info('gmail.messages.export-csv called', {
|
|
274
|
+
query: parsedQuery,
|
|
275
|
+
maxItems: maxItems,
|
|
276
|
+
filename: filename,
|
|
277
|
+
accountId: extra.authContext.accountId
|
|
278
|
+
});
|
|
285
279
|
gmail = _googleapis.google.gmail({
|
|
286
280
|
version: 'v1',
|
|
287
281
|
auth: extra.authContext.auth
|
|
@@ -328,7 +322,7 @@ var config = {
|
|
|
328
322
|
pageSize = Math.min(remainingItems, _constantsts.DEFAULT_PAGE_SIZE);
|
|
329
323
|
return [
|
|
330
324
|
4,
|
|
331
|
-
(0, _executequeryts.executeQuery)(
|
|
325
|
+
(0, _executequeryts.executeQuery)(parsedQuery, _object_spread_props(_object_spread({
|
|
332
326
|
client: gmail,
|
|
333
327
|
logger: logger,
|
|
334
328
|
pageSize: pageSize
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/mcp/tools/messages-export-csv.ts"],"sourcesContent":["import { EmailContentTypeSchema, 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 { getFileUri, reserveFile, type ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\n\nimport { stringify } from 'csv-stringify/sync';\nimport { createWriteStream } from 'fs';\nimport { unlink } from 'fs/promises';\nimport { type gmail_v1, google } from 'googleapis';\nimport { z } from 'zod';\nimport { DEFAULT_PAGE_SIZE } from '../../constants.ts';\nimport { extractBodyFromPayload } from '../../email/parsing/html-processing.ts';\nimport { executeQuery as executeGmailQuery } from '../../email/querying/execute-query.ts';\nimport { GmailQueryParameterSchema } from '../../schemas/gmail-query-schema.ts';\nimport type { StorageExtra } from '../../types.ts';\n\nconst DEFAULT_MAX_ITEMS = 10000;\nconst MAX_EXPORT_ITEMS = 50000;\n\n/**\n * CSV row format based on EmailDetail\n * All fields are strings (empty string instead of undefined)\n * Includes additional CSV-specific fields: provider and labels\n */\ninterface CsvRow {\n id: string;\n threadId: string;\n from: string;\n to: string;\n cc: string;\n bcc: string;\n subject: string;\n date: string;\n snippet: string;\n body: string;\n provider: string;\n labels: string;\n}\n\nconst inputSchema = z.object({\n query: GmailQueryParameterSchema.optional().describe('Structured query object or JSON string for filtering messages. Use query-syntax prompt for reference and rawGmailQuery for Gmail syntax.'),\n maxItems: z.number().int().positive().max(MAX_EXPORT_ITEMS).default(DEFAULT_MAX_ITEMS).describe(`Maximum messages to export (default: ${DEFAULT_MAX_ITEMS}, max: ${MAX_EXPORT_ITEMS})`),\n filename: z.string().trim().min(1).default('gmail-messages.csv').describe('Output filename (default: gmail-messages.csv)'),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n uri: z.string().describe('File URI (file:// or http://)'),\n filename: z.string().describe('Stored filename'),\n rowCount: z.number().describe('Number of messages exported'),\n truncated: z.boolean().describe('Whether export was truncated at maxItems'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Export Gmail messages to CSV with streaming pagination. Returns file URI. Use query-syntax prompt for query reference.',\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\n/**\n * Handler for gmail-messages-export-csv tool\n *\n * CRITICAL: Streaming implementation per user requirements\n * - Generate UUID upfront\n * - Write CSV header immediately\n * - Append rows as batches arrive\n * - Delete partial file on error\n * - NO RETRIES (fail fast on error)\n */\nasync function handler({ query, maxItems, filename, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra & StorageExtra) {\n const logger = extra.logger;\n const { storageContext } = extra;\n const { transport, resourceStoreUri, baseUrl } = storageContext;\n\n logger.info('gmail.messages.export-csv called', {\n query,\n maxItems,\n filename,\n accountId: extra.authContext.accountId,\n });\n\n // Reserve file location for streaming write (creates directory, generates ID, formats filename)\n const reservation = await reserveFile(filename, {\n resourceStoreUri,\n });\n const { storedName, fullPath } = reservation;\n\n logger.info('gmail.messages.export-csv starting streaming export', { path: fullPath, maxItems });\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n\n // Create CSV headers (all email fields)\n const csvHeaders = ['id', 'threadId', 'from', 'to', 'cc', 'bcc', 'subject', 'date', 'snippet', 'body', 'provider', 'labels'];\n\n // Create write stream and write headers immediately\n const writeStream = createWriteStream(fullPath, { encoding: 'utf-8' });\n const headerLine = stringify([csvHeaders], { header: false, quoted: true, quote: '\"', escape: '\"' });\n writeStream.write(headerLine);\n\n // Internal pagination loop - append to CSV with each batch\n // NO RETRIES: If any error occurs, fail the whole operation and clean up\n let totalRows = 0;\n let nextPageToken: string | undefined;\n const started = Date.now();\n\n while (totalRows < maxItems) {\n const remainingItems = maxItems - totalRows;\n const pageSize = Math.min(remainingItems, DEFAULT_PAGE_SIZE);\n\n const exec: {\n items: CsvRow[];\n metadata?: { nextPageToken?: string };\n } = await executeGmailQuery(\n query,\n {\n client: gmail,\n logger,\n pageSize,\n ...(nextPageToken !== undefined && { pageToken: nextPageToken }),\n includeBody: true, // Always include body for CSV export\n },\n (full: unknown): CsvRow => {\n // Type-safe property access with guards\n const fullData = full as {\n id?: unknown;\n threadId?: unknown;\n snippet?: unknown;\n labelIds?: unknown[];\n payload?: { headers?: unknown[] };\n };\n\n const headersArray = Array.isArray(fullData?.payload?.headers) ? fullData.payload.headers : [];\n const headers = Object.fromEntries(\n headersArray.map((h: unknown) => {\n const header = h as { name?: unknown; value?: unknown };\n return [String(header.name ?? ''), String(header.value ?? '')];\n })\n );\n\n const payload = fullData?.payload;\n // Cast to Schema$MessagePart for extractBodyFromPayload\n const body = payload ? extractBodyFromPayload(payload as gmail_v1.Schema$MessagePart, { contentType, excludeThreadHistory }) : '';\n\n const labelIds = Array.isArray(fullData?.labelIds) ? fullData.labelIds.map((id) => String(id ?? '')) : [];\n\n return {\n id: String(fullData?.id ?? ''),\n threadId: fullData?.threadId ? String(fullData.threadId) : '',\n from: headers?.From || '',\n to: headers?.To || '',\n cc: headers?.Cc || '',\n bcc: headers?.Bcc || '',\n subject: headers?.Subject || '',\n date: headers?.Date || '',\n snippet: fullData?.snippet ? String(fullData.snippet) : '',\n body,\n provider: 'gmail',\n labels: labelIds.join(';'),\n };\n }\n );\n\n // Type-safe CSV row mapping\n const csvRows = exec.items.map((row) => {\n return [row.id, row.threadId, row.from, row.to, row.cc, row.bcc, row.subject, row.date, row.snippet, row.body, row.provider, row.labels];\n });\n\n // Append rows to CSV file immediately\n if (csvRows.length > 0) {\n const rowsContent = stringify(csvRows, { header: false, quoted: true, quote: '\"', escape: '\"' });\n writeStream.write(rowsContent);\n }\n\n totalRows += exec.items.length;\n nextPageToken = exec.metadata?.nextPageToken;\n\n logger.info('gmail.messages.export-csv batch written', {\n batchSize: exec.items.length,\n totalRows,\n hasMore: Boolean(nextPageToken),\n });\n\n // Exit if no more results or reached maxItems\n if (!nextPageToken || exec.items.length === 0) {\n break;\n }\n }\n\n // Close write stream\n await new Promise<void>((resolve, reject) => {\n writeStream.end(() => resolve());\n writeStream.on('error', reject);\n });\n\n const durationMs = Date.now() - started;\n const truncated = totalRows >= maxItems && Boolean(nextPageToken);\n\n logger.info('gmail.messages.export-csv completed', {\n rowCount: totalRows,\n truncated,\n durationMs,\n filename: storedName,\n });\n\n // Generate URI based on transport type (stdio: file://, HTTP: http://)\n const uri = getFileUri(storedName, transport, {\n resourceStoreUri,\n ...(baseUrl && { baseUrl }),\n endpoint: '/files',\n });\n\n const result: Output = {\n type: 'success' as const,\n uri,\n filename: storedName,\n rowCount: totalRows,\n truncated,\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 // CRITICAL: Clean up partial CSV file on error\n try {\n await unlink(fullPath);\n logger.debug('Cleaned up partial CSV file after error', { path: fullPath });\n } catch (_cleanupError) {\n logger.debug('Could not clean up CSV file (may not exist)', { path: fullPath });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.messages.export-csv error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error exporting messages to CSV: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'messages-export-csv',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","DEFAULT_MAX_ITEMS","MAX_EXPORT_ITEMS","inputSchema","z","object","query","GmailQueryParameterSchema","optional","describe","maxItems","number","int","positive","max","default","filename","string","trim","min","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successBranchSchema","type","literal","uri","rowCount","truncated","boolean","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","storageContext","transport","resourceStoreUri","baseUrl","reservation","storedName","fullPath","gmail","csvHeaders","writeStream","headerLine","totalRows","nextPageToken","started","exec","remainingItems","pageSize","csvRows","rowsContent","durationMs","error","_cleanupError","message","info","accountId","authContext","reserveFile","path","google","version","auth","createWriteStream","encoding","stringify","header","quoted","quote","escape","write","Date","now","Math","DEFAULT_PAGE_SIZE","executeGmailQuery","client","undefined","pageToken","includeBody","full","fullData","headersArray","Array","isArray","payload","headers","Object","fromEntries","map","h","String","name","value","body","extractBodyFromPayload","labelIds","id","threadId","from","From","to","To","cc","Cc","bcc","Bcc","subject","Subject","date","snippet","provider","labels","join","items","row","length","metadata","batchSize","hasMore","Boolean","Promise","resolve","reject","end","on","getFileUri","endpoint","content","text","JSON","structuredContent","unlink","debug","Error","McpError","ErrorCode","InternalError","stack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/messages-export-csv.ts"],"sourcesContent":["import { EmailContentTypeSchema, 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 { getFileUri, reserveFile, type ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\n\nimport { stringify } from 'csv-stringify/sync';\nimport { createWriteStream } from 'fs';\nimport { unlink } from 'fs/promises';\nimport { type gmail_v1, google } from 'googleapis';\nimport { z } from 'zod';\nimport { DEFAULT_PAGE_SIZE } from '../../constants.ts';\nimport { extractBodyFromPayload } from '../../email/parsing/html-processing.ts';\nimport { executeQuery as executeGmailQuery } from '../../email/querying/execute-query.ts';\nimport { GmailQueryParameterSchema, parseGmailQueryParameter } from '../../schemas/gmail-query-schema.ts';\nimport type { StorageExtra } from '../../types.ts';\n\nconst DEFAULT_MAX_ITEMS = 10000;\nconst MAX_EXPORT_ITEMS = 50000;\n\n/**\n * CSV row format based on EmailDetail\n * All fields are strings (empty string instead of undefined)\n * Includes additional CSV-specific fields: provider and labels\n */\ninterface CsvRow {\n id: string;\n threadId: string;\n from: string;\n to: string;\n cc: string;\n bcc: string;\n subject: string;\n date: string;\n snippet: string;\n body: string;\n provider: string;\n labels: string;\n}\n\nconst inputSchema = z.object({\n query: GmailQueryParameterSchema.optional().describe('Structured query object or JSON string for filtering messages. Use query-syntax prompt for reference and rawGmailQuery for Gmail syntax.'),\n maxItems: z.number().int().positive().max(MAX_EXPORT_ITEMS).default(DEFAULT_MAX_ITEMS).describe(`Maximum messages to export (default: ${DEFAULT_MAX_ITEMS}, max: ${MAX_EXPORT_ITEMS})`),\n filename: z.string().trim().min(1).default('gmail-messages.csv').describe('Output filename (default: gmail-messages.csv)'),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n uri: z.string().describe('File URI (file:// or http://)'),\n filename: z.string().describe('Stored filename'),\n rowCount: z.number().describe('Number of messages exported'),\n truncated: z.boolean().describe('Whether export was truncated at maxItems'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Export Gmail messages to CSV with streaming pagination. Returns file URI. Use query-syntax prompt for query reference.',\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\n/**\n * Handler for gmail-messages-export-csv tool\n *\n * CRITICAL: Streaming implementation per user requirements\n * - Generate UUID upfront\n * - Write CSV header immediately\n * - Append rows as batches arrive\n * - Delete partial file on error\n * - NO RETRIES (fail fast on error)\n */\nasync function handler({ query, maxItems, filename, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra & StorageExtra) {\n const logger = extra.logger;\n const { storageContext } = extra;\n const { transport, resourceStoreUri, baseUrl } = storageContext;\n\n // Reserve file location for streaming write (creates directory, generates ID, formats filename)\n const reservation = await reserveFile(filename, {\n resourceStoreUri,\n });\n const { storedName, fullPath } = reservation;\n\n logger.info('gmail.messages.export-csv starting streaming export', { path: fullPath, maxItems });\n\n try {\n const parsedQuery = parseGmailQueryParameter(query);\n\n logger.info('gmail.messages.export-csv called', {\n query: parsedQuery,\n maxItems,\n filename,\n accountId: extra.authContext.accountId,\n });\n\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n\n // Create CSV headers (all email fields)\n const csvHeaders = ['id', 'threadId', 'from', 'to', 'cc', 'bcc', 'subject', 'date', 'snippet', 'body', 'provider', 'labels'];\n\n // Create write stream and write headers immediately\n const writeStream = createWriteStream(fullPath, { encoding: 'utf-8' });\n const headerLine = stringify([csvHeaders], { header: false, quoted: true, quote: '\"', escape: '\"' });\n writeStream.write(headerLine);\n\n // Internal pagination loop - append to CSV with each batch\n // NO RETRIES: If any error occurs, fail the whole operation and clean up\n let totalRows = 0;\n let nextPageToken: string | undefined;\n const started = Date.now();\n\n while (totalRows < maxItems) {\n const remainingItems = maxItems - totalRows;\n const pageSize = Math.min(remainingItems, DEFAULT_PAGE_SIZE);\n\n const exec: {\n items: CsvRow[];\n metadata?: { nextPageToken?: string };\n } = await executeGmailQuery(\n parsedQuery,\n {\n client: gmail,\n logger,\n pageSize,\n ...(nextPageToken !== undefined && { pageToken: nextPageToken }),\n includeBody: true, // Always include body for CSV export\n },\n (full: unknown): CsvRow => {\n // Type-safe property access with guards\n const fullData = full as {\n id?: unknown;\n threadId?: unknown;\n snippet?: unknown;\n labelIds?: unknown[];\n payload?: { headers?: unknown[] };\n };\n\n const headersArray = Array.isArray(fullData?.payload?.headers) ? fullData.payload.headers : [];\n const headers = Object.fromEntries(\n headersArray.map((h: unknown) => {\n const header = h as { name?: unknown; value?: unknown };\n return [String(header.name ?? ''), String(header.value ?? '')];\n })\n );\n\n const payload = fullData?.payload;\n // Cast to Schema$MessagePart for extractBodyFromPayload\n const body = payload ? extractBodyFromPayload(payload as gmail_v1.Schema$MessagePart, { contentType, excludeThreadHistory }) : '';\n\n const labelIds = Array.isArray(fullData?.labelIds) ? fullData.labelIds.map((id) => String(id ?? '')) : [];\n\n return {\n id: String(fullData?.id ?? ''),\n threadId: fullData?.threadId ? String(fullData.threadId) : '',\n from: headers?.From || '',\n to: headers?.To || '',\n cc: headers?.Cc || '',\n bcc: headers?.Bcc || '',\n subject: headers?.Subject || '',\n date: headers?.Date || '',\n snippet: fullData?.snippet ? String(fullData.snippet) : '',\n body,\n provider: 'gmail',\n labels: labelIds.join(';'),\n };\n }\n );\n\n // Type-safe CSV row mapping\n const csvRows = exec.items.map((row) => {\n return [row.id, row.threadId, row.from, row.to, row.cc, row.bcc, row.subject, row.date, row.snippet, row.body, row.provider, row.labels];\n });\n\n // Append rows to CSV file immediately\n if (csvRows.length > 0) {\n const rowsContent = stringify(csvRows, { header: false, quoted: true, quote: '\"', escape: '\"' });\n writeStream.write(rowsContent);\n }\n\n totalRows += exec.items.length;\n nextPageToken = exec.metadata?.nextPageToken;\n\n logger.info('gmail.messages.export-csv batch written', {\n batchSize: exec.items.length,\n totalRows,\n hasMore: Boolean(nextPageToken),\n });\n\n // Exit if no more results or reached maxItems\n if (!nextPageToken || exec.items.length === 0) {\n break;\n }\n }\n\n // Close write stream\n await new Promise<void>((resolve, reject) => {\n writeStream.end(() => resolve());\n writeStream.on('error', reject);\n });\n\n const durationMs = Date.now() - started;\n const truncated = totalRows >= maxItems && Boolean(nextPageToken);\n\n logger.info('gmail.messages.export-csv completed', {\n rowCount: totalRows,\n truncated,\n durationMs,\n filename: storedName,\n });\n\n // Generate URI based on transport type (stdio: file://, HTTP: http://)\n const uri = getFileUri(storedName, transport, {\n resourceStoreUri,\n ...(baseUrl && { baseUrl }),\n endpoint: '/files',\n });\n\n const result: Output = {\n type: 'success' as const,\n uri,\n filename: storedName,\n rowCount: totalRows,\n truncated,\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 // CRITICAL: Clean up partial CSV file on error\n try {\n await unlink(fullPath);\n logger.debug('Cleaned up partial CSV file after error', { path: fullPath });\n } catch (_cleanupError) {\n logger.debug('Could not clean up CSV file (may not exist)', { path: fullPath });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.messages.export-csv error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error exporting messages to CSV: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'messages-export-csv',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","DEFAULT_MAX_ITEMS","MAX_EXPORT_ITEMS","inputSchema","z","object","query","GmailQueryParameterSchema","optional","describe","maxItems","number","int","positive","max","default","filename","string","trim","min","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successBranchSchema","type","literal","uri","rowCount","truncated","boolean","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","storageContext","transport","resourceStoreUri","baseUrl","reservation","storedName","fullPath","parsedQuery","gmail","csvHeaders","writeStream","headerLine","totalRows","nextPageToken","started","exec","remainingItems","pageSize","csvRows","rowsContent","durationMs","error","_cleanupError","message","reserveFile","info","path","parseGmailQueryParameter","accountId","authContext","google","version","auth","createWriteStream","encoding","stringify","header","quoted","quote","escape","write","Date","now","Math","DEFAULT_PAGE_SIZE","executeGmailQuery","client","undefined","pageToken","includeBody","full","fullData","headersArray","Array","isArray","payload","headers","Object","fromEntries","map","h","String","name","value","body","extractBodyFromPayload","labelIds","id","threadId","from","From","to","To","cc","Cc","bcc","Bcc","subject","Subject","date","snippet","provider","labels","join","items","row","length","metadata","batchSize","hasMore","Boolean","Promise","resolve","reject","end","on","getFileUri","endpoint","content","text","JSON","structuredContent","unlink","debug","Error","McpError","ErrorCode","InternalError","stack"],"mappings":"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"}
|
|
@@ -21,8 +21,9 @@ import { z } from 'zod';
|
|
|
21
21
|
* TypeScript sees the strict GmailQuery type everywhere the schema is used.
|
|
22
22
|
*/
|
|
23
23
|
export declare const GmailQuerySchema: z.ZodType<GmailQuery>;
|
|
24
|
-
export declare const GmailQueryParameterSchema: z.ZodType<GmailQuery>;
|
|
24
|
+
export declare const GmailQueryParameterSchema: z.ZodType<GmailQuery | string>;
|
|
25
25
|
export type GmailQueryParameter = z.infer<typeof GmailQueryParameterSchema>;
|
|
26
|
+
export declare function parseGmailQueryParameter(input: GmailQuery | string | undefined): GmailQuery | undefined;
|
|
26
27
|
export type GmailQuery = BaseEmailQueryFields & {
|
|
27
28
|
$and?: GmailQuery[];
|
|
28
29
|
$or?: GmailQuery[];
|
|
@@ -21,8 +21,9 @@ import { z } from 'zod';
|
|
|
21
21
|
* TypeScript sees the strict GmailQuery type everywhere the schema is used.
|
|
22
22
|
*/
|
|
23
23
|
export declare const GmailQuerySchema: z.ZodType<GmailQuery>;
|
|
24
|
-
export declare const GmailQueryParameterSchema: z.ZodType<GmailQuery>;
|
|
24
|
+
export declare const GmailQueryParameterSchema: z.ZodType<GmailQuery | string>;
|
|
25
25
|
export type GmailQueryParameter = z.infer<typeof GmailQueryParameterSchema>;
|
|
26
|
+
export declare function parseGmailQueryParameter(input: GmailQuery | string | undefined): GmailQuery | undefined;
|
|
26
27
|
export type GmailQuery = BaseEmailQueryFields & {
|
|
27
28
|
$and?: GmailQuery[];
|
|
28
29
|
$or?: GmailQuery[];
|
|
@@ -14,6 +14,9 @@ _export(exports, {
|
|
|
14
14
|
},
|
|
15
15
|
get GmailQuerySchema () {
|
|
16
16
|
return GmailQuerySchema;
|
|
17
|
+
},
|
|
18
|
+
get parseGmailQueryParameter () {
|
|
19
|
+
return parseGmailQueryParameter;
|
|
17
20
|
}
|
|
18
21
|
});
|
|
19
22
|
var _email = require("@mcp-z/email");
|
|
@@ -26,17 +29,14 @@ function _define_property(obj, key, value) {
|
|
|
26
29
|
configurable: true,
|
|
27
30
|
writable: true
|
|
28
31
|
});
|
|
29
|
-
} else
|
|
30
|
-
obj[key] = value;
|
|
31
|
-
}
|
|
32
|
+
} else obj[key] = value;
|
|
32
33
|
return obj;
|
|
33
34
|
}
|
|
34
35
|
function _instanceof(left, right) {
|
|
36
|
+
"@swc/helpers - instanceof";
|
|
35
37
|
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
36
38
|
return !!right[Symbol.hasInstance](left);
|
|
37
|
-
} else
|
|
38
|
-
return left instanceof right;
|
|
39
|
-
}
|
|
39
|
+
} else return left instanceof right;
|
|
40
40
|
}
|
|
41
41
|
function _object_spread(target) {
|
|
42
42
|
for(var i = 1; i < arguments.length; i++){
|
|
@@ -68,9 +68,8 @@ function ownKeys(object, enumerableOnly) {
|
|
|
68
68
|
}
|
|
69
69
|
function _object_spread_props(target, source) {
|
|
70
70
|
source = source != null ? source : {};
|
|
71
|
-
if (Object.getOwnPropertyDescriptors)
|
|
72
|
-
|
|
73
|
-
} else {
|
|
71
|
+
if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
72
|
+
else {
|
|
74
73
|
ownKeys(Object(source)).forEach(function(key) {
|
|
75
74
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
76
75
|
});
|
|
@@ -129,28 +128,25 @@ var GmailQuerySchema = _zod.z.lazy(function() {
|
|
|
129
128
|
rawGmailQuery: _zod.z.string().min(1).optional().describe('Raw Gmail query syntax for advanced use cases. Bypasses schema validation - use sparingly.')
|
|
130
129
|
})).strict();
|
|
131
130
|
});
|
|
132
|
-
var GmailQueryParameterSchema = _zod.z.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
code: _zod.z.ZodIssueCode.custom,
|
|
141
|
-
message: "Query must be valid JSON. ".concat(message, '. Wrap Gmail syntax in {"rawGmailQuery":"<query>"} if needed.')
|
|
142
|
-
});
|
|
143
|
-
return _zod.z.NEVER;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
var validated = GmailQuerySchema.safeParse(parsed);
|
|
131
|
+
var GmailQueryParameterSchema = _zod.z.union([
|
|
132
|
+
GmailQuerySchema,
|
|
133
|
+
_zod.z.string().min(1)
|
|
134
|
+
]);
|
|
135
|
+
function parseGmailQueryParameter(input) {
|
|
136
|
+
if (input === undefined) return undefined;
|
|
137
|
+
var raw = typeof input === 'string' ? safeJsonParse(input, 'rawGmailQuery') : input;
|
|
138
|
+
var validated = GmailQuerySchema.safeParse(raw);
|
|
147
139
|
if (!validated.success) {
|
|
148
|
-
|
|
149
|
-
code: _zod.z.ZodIssueCode.custom,
|
|
150
|
-
message: "Invalid query JSON: ".concat(validated.error.message, '. Use {"rawGmailQuery":"<query>"} for Gmail syntax.')
|
|
151
|
-
});
|
|
152
|
-
return _zod.z.NEVER;
|
|
140
|
+
throw new Error("Invalid query JSON: ".concat(validated.error.message, '. Use {"rawGmailQuery":"<query>"} for Gmail syntax.'));
|
|
153
141
|
}
|
|
154
142
|
return validated.data;
|
|
155
|
-
}
|
|
143
|
+
}
|
|
144
|
+
function safeJsonParse(value, rawField) {
|
|
145
|
+
try {
|
|
146
|
+
return JSON.parse(value);
|
|
147
|
+
} catch (error) {
|
|
148
|
+
var message = _instanceof(error, Error) ? error.message : 'Invalid JSON';
|
|
149
|
+
throw new Error("Query must be valid JSON. ".concat(message, '. Wrap Gmail syntax in {"').concat(rawField, '":"<query>"} if needed.'));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
156
152
|
/* 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; }
|