@mcp-z/mcp-gmail 1.0.10 → 1.0.12

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.
Files changed (139) hide show
  1. package/dist/cjs/constants.js.map +1 -1
  2. package/dist/cjs/email/composition/rfc822-builder.js.map +1 -1
  3. package/dist/cjs/email/messages/fetch-message.js +15 -21
  4. package/dist/cjs/email/messages/fetch-message.js.map +1 -1
  5. package/dist/cjs/email/messages/messages.js +2 -2
  6. package/dist/cjs/email/messages/messages.js.map +1 -1
  7. package/dist/cjs/email/parsing/header-parsing.js.map +1 -1
  8. package/dist/cjs/email/parsing/headers-utils.js.map +1 -1
  9. package/dist/cjs/email/parsing/html-processing.js.map +1 -1
  10. package/dist/cjs/email/parsing/message-extraction.js.map +1 -1
  11. package/dist/cjs/email/querying/execute-query.js +7 -14
  12. package/dist/cjs/email/querying/execute-query.js.map +1 -1
  13. package/dist/cjs/email/querying/pagination.js +19 -24
  14. package/dist/cjs/email/querying/pagination.js.map +1 -1
  15. package/dist/cjs/email/querying/query-builder.js +4 -2
  16. package/dist/cjs/email/querying/query-builder.js.map +1 -1
  17. package/dist/cjs/email/querying/search-execution.js +2 -5
  18. package/dist/cjs/email/querying/search-execution.js.map +1 -1
  19. package/dist/cjs/index.js +10 -24
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/cjs/labels/gmail-labels.js +2 -5
  22. package/dist/cjs/labels/gmail-labels.js.map +1 -1
  23. package/dist/cjs/lib/base64-encoding.js.map +1 -1
  24. package/dist/cjs/lib/create-store.js +2 -5
  25. package/dist/cjs/lib/create-store.js.map +1 -1
  26. package/dist/cjs/lib/date-conversion.js.map +1 -1
  27. package/dist/cjs/lib/messages-to-row.js +2 -2
  28. package/dist/cjs/lib/messages-to-row.js.map +1 -1
  29. package/dist/cjs/mcp/index.js +8 -19
  30. package/dist/cjs/mcp/index.js.map +1 -1
  31. package/dist/cjs/mcp/prompts/draft-email.js +3 -6
  32. package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
  33. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  34. package/dist/cjs/mcp/prompts/query-syntax.js +3 -6
  35. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
  36. package/dist/cjs/mcp/resources/email.js +3 -6
  37. package/dist/cjs/mcp/resources/email.js.map +1 -1
  38. package/dist/cjs/mcp/resources/index.js.map +1 -1
  39. package/dist/cjs/mcp/tools/categories-list.js +4 -8
  40. package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
  41. package/dist/cjs/mcp/tools/index.js.map +1 -1
  42. package/dist/cjs/mcp/tools/label-add.js +4 -8
  43. package/dist/cjs/mcp/tools/label-add.js.map +1 -1
  44. package/dist/cjs/mcp/tools/label-delete.d.cts +1 -1
  45. package/dist/cjs/mcp/tools/label-delete.d.ts +1 -1
  46. package/dist/cjs/mcp/tools/label-delete.js +36 -32
  47. package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
  48. package/dist/cjs/mcp/tools/labels-list.js +4 -8
  49. package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
  50. package/dist/cjs/mcp/tools/message-get.d.cts +21 -21
  51. package/dist/cjs/mcp/tools/message-get.d.ts +21 -21
  52. package/dist/cjs/mcp/tools/message-get.js +4 -8
  53. package/dist/cjs/mcp/tools/message-get.js.map +1 -1
  54. package/dist/cjs/mcp/tools/message-mark-read.js +4 -8
  55. package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
  56. package/dist/cjs/mcp/tools/message-move-to-trash.d.cts +1 -1
  57. package/dist/cjs/mcp/tools/message-move-to-trash.d.ts +1 -1
  58. package/dist/cjs/mcp/tools/message-move-to-trash.js +36 -32
  59. package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
  60. package/dist/cjs/mcp/tools/message-respond.js +5 -11
  61. package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
  62. package/dist/cjs/mcp/tools/message-search.d.cts +23 -23
  63. package/dist/cjs/mcp/tools/message-search.d.ts +23 -23
  64. package/dist/cjs/mcp/tools/message-search.js +7 -14
  65. package/dist/cjs/mcp/tools/message-search.js.map +1 -1
  66. package/dist/cjs/mcp/tools/message-send.d.cts +3 -3
  67. package/dist/cjs/mcp/tools/message-send.d.ts +3 -3
  68. package/dist/cjs/mcp/tools/message-send.js +4 -8
  69. package/dist/cjs/mcp/tools/message-send.js.map +1 -1
  70. package/dist/cjs/mcp/tools/messages-export-csv.js +7 -14
  71. package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
  72. package/dist/cjs/schemas/gmail-query-schema.js +5 -9
  73. package/dist/cjs/schemas/gmail-query-schema.js.map +1 -1
  74. package/dist/cjs/schemas/index.js.map +1 -1
  75. package/dist/cjs/setup/config.js +11 -25
  76. package/dist/cjs/setup/config.js.map +1 -1
  77. package/dist/cjs/setup/http.js +15 -16
  78. package/dist/cjs/setup/http.js.map +1 -1
  79. package/dist/cjs/setup/index.js.map +1 -1
  80. package/dist/cjs/setup/oauth-google.js +9 -16
  81. package/dist/cjs/setup/oauth-google.js.map +1 -1
  82. package/dist/cjs/setup/runtime.d.cts +1 -1
  83. package/dist/cjs/setup/runtime.d.ts +1 -1
  84. package/dist/cjs/setup/runtime.js +29 -44
  85. package/dist/cjs/setup/runtime.js.map +1 -1
  86. package/dist/cjs/setup/stdio.js +15 -16
  87. package/dist/cjs/setup/stdio.js.map +1 -1
  88. package/dist/esm/constants.js.map +1 -1
  89. package/dist/esm/email/composition/rfc822-builder.js.map +1 -1
  90. package/dist/esm/email/messages/fetch-message.js.map +1 -1
  91. package/dist/esm/email/messages/messages.js.map +1 -1
  92. package/dist/esm/email/parsing/header-parsing.js.map +1 -1
  93. package/dist/esm/email/parsing/headers-utils.js.map +1 -1
  94. package/dist/esm/email/parsing/html-processing.js.map +1 -1
  95. package/dist/esm/email/parsing/message-extraction.js.map +1 -1
  96. package/dist/esm/email/querying/execute-query.js.map +1 -1
  97. package/dist/esm/email/querying/pagination.js.map +1 -1
  98. package/dist/esm/email/querying/query-builder.js.map +1 -1
  99. package/dist/esm/email/querying/search-execution.js.map +1 -1
  100. package/dist/esm/index.js.map +1 -1
  101. package/dist/esm/labels/gmail-labels.js.map +1 -1
  102. package/dist/esm/lib/base64-encoding.js.map +1 -1
  103. package/dist/esm/lib/create-store.js.map +1 -1
  104. package/dist/esm/lib/date-conversion.js.map +1 -1
  105. package/dist/esm/lib/messages-to-row.js.map +1 -1
  106. package/dist/esm/mcp/index.js.map +1 -1
  107. package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
  108. package/dist/esm/mcp/prompts/index.js.map +1 -1
  109. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
  110. package/dist/esm/mcp/resources/email.js.map +1 -1
  111. package/dist/esm/mcp/resources/index.js.map +1 -1
  112. package/dist/esm/mcp/tools/categories-list.js.map +1 -1
  113. package/dist/esm/mcp/tools/index.js.map +1 -1
  114. package/dist/esm/mcp/tools/label-add.js.map +1 -1
  115. package/dist/esm/mcp/tools/label-delete.d.ts +1 -1
  116. package/dist/esm/mcp/tools/label-delete.js.map +1 -1
  117. package/dist/esm/mcp/tools/labels-list.js.map +1 -1
  118. package/dist/esm/mcp/tools/message-get.d.ts +21 -21
  119. package/dist/esm/mcp/tools/message-get.js.map +1 -1
  120. package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
  121. package/dist/esm/mcp/tools/message-move-to-trash.d.ts +1 -1
  122. package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
  123. package/dist/esm/mcp/tools/message-respond.js.map +1 -1
  124. package/dist/esm/mcp/tools/message-search.d.ts +23 -23
  125. package/dist/esm/mcp/tools/message-search.js.map +1 -1
  126. package/dist/esm/mcp/tools/message-send.d.ts +3 -3
  127. package/dist/esm/mcp/tools/message-send.js.map +1 -1
  128. package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
  129. package/dist/esm/schemas/gmail-query-schema.js.map +1 -1
  130. package/dist/esm/schemas/index.js.map +1 -1
  131. package/dist/esm/setup/config.js.map +1 -1
  132. package/dist/esm/setup/http.js.map +1 -1
  133. package/dist/esm/setup/index.js.map +1 -1
  134. package/dist/esm/setup/oauth-google.js.map +1 -1
  135. package/dist/esm/setup/runtime.d.ts +1 -1
  136. package/dist/esm/setup/runtime.js.map +1 -1
  137. package/dist/esm/setup/stdio.js.map +1 -1
  138. package/dist/esm/types.js.map +1 -1
  139. package/package.json +15 -11
@@ -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, 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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"}
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
- resolve(value);
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/Projects/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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"}
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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"}
@@ -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
- resolve(value);
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
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
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
  });
@@ -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, 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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"}
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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"}
@@ -29,17 +29,14 @@ function _define_property(obj, key, value) {
29
29
  configurable: true,
30
30
  writable: true
31
31
  });
32
- } else {
33
- obj[key] = value;
34
- }
32
+ } else obj[key] = value;
35
33
  return obj;
36
34
  }
37
35
  function _instanceof(left, right) {
36
+ "@swc/helpers - instanceof";
38
37
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
39
38
  return !!right[Symbol.hasInstance](left);
40
- } else {
41
- return left instanceof right;
42
- }
39
+ } else return left instanceof right;
43
40
  }
44
41
  function _object_spread(target) {
45
42
  for(var i = 1; i < arguments.length; i++){
@@ -71,9 +68,8 @@ function ownKeys(object, enumerableOnly) {
71
68
  }
72
69
  function _object_spread_props(target, source) {
73
70
  source = source != null ? source : {};
74
- if (Object.getOwnPropertyDescriptors) {
75
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
76
- } else {
71
+ if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
72
+ else {
77
73
  ownKeys(Object(source)).forEach(function(key) {
78
74
  Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
79
75
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/schemas/gmail-query-schema.ts"],"sourcesContent":["import { type BaseEmailQueryFields, baseEmailQueryFields, type FieldOperator, FieldOperatorSchema } from '@mcp-z/email';\nimport { z } from 'zod';\n\n/**\n * Gmail-specific query schema with recursive operators and Gmail features.\n *\n * Includes Gmail-specific features:\n * - fuzzyPhrase: Approximate phrase matching (Gmail's quoted string behavior with relevance ranking)\n * - categories: Gmail system categories (primary, social, promotions, updates, forums)\n * - label: User-created Gmail labels (case-sensitive, discovered via gmail-labels-list)\n * - rawGmailQuery: Escape hatch for advanced Gmail query syntax\n *\n * Plus all base fields from baseEmailQueryFields:\n * - Email addresses: from, to, cc, bcc (support string or field operators)\n * - Content: subject, body, text\n * - Flags: hasAttachment, isRead\n * - Date range: date { $gte, $lt }\n * - Logical operators: $and, $or, $not (recursive)\n *\n * Note: Cast through unknown to work around Zod's lazy schema type inference issue\n * with exactOptionalPropertyTypes. The runtime schema is correct; this cast ensures\n * TypeScript sees the strict GmailQuery type everywhere the schema is used.\n */\nexport const GmailQuerySchema = z.lazy(() =>\n z\n .object({\n // Logical operators for combining conditions (recursive)\n $and: z.array(GmailQuerySchema).optional().describe('Array of conditions that must ALL match'),\n $or: z.array(GmailQuerySchema).optional().describe('Array of conditions where ANY must match'),\n $not: GmailQuerySchema.optional().describe('Nested condition that must NOT match'),\n\n // Spread base email query fields (from, to, subject, body, etc.)\n ...baseEmailQueryFields,\n\n // Gmail-specific features\n\n // Fuzzy phrase matching - Gmail's approximate search using quoted strings\n fuzzyPhrase: z.string().min(1).optional().describe('Fuzzy phrase matching - words should appear together (approximate matching). Gmail uses relevance-based matching.'),\n\n // Gmail system categories with field operator support\n categories: z\n .union([\n z.enum(['primary', 'social', 'promotions', 'updates', 'forums']),\n z\n .object({\n $any: z.array(z.enum(['primary', 'social', 'promotions', 'updates', 'forums'])).optional(),\n $all: z.array(z.enum(['primary', 'social', 'promotions', 'updates', 'forums'])).optional(),\n $none: z.array(z.enum(['primary', 'social', 'promotions', 'updates', 'forums'])).optional(),\n })\n .strict(),\n ])\n .optional()\n .describe('Filter by Gmail system categories (primary, social, promotions, updates, forums)'),\n\n // User-created labels\n label: z\n .union([z.string().min(1), FieldOperatorSchema])\n .optional()\n .describe('Filter by user-created labels (case-sensitive). Use gmail-labels-list to see available labels'),\n\n // Raw Gmail query string - escape hatch for advanced syntax\n rawGmailQuery: z.string().min(1).optional().describe('Raw Gmail query syntax for advanced use cases. Bypasses schema validation - use sparingly.'),\n })\n .strict()\n) as unknown as z.ZodType<GmailQuery>;\n\nexport const GmailQueryParameterSchema = z.union([GmailQuerySchema, z.string().min(1)]) as z.ZodType<GmailQuery | string>;\nexport type GmailQueryParameter = z.infer<typeof GmailQueryParameterSchema>;\n\nexport function parseGmailQueryParameter(input: GmailQuery | string | undefined): GmailQuery | undefined {\n if (input === undefined) return undefined;\n const raw = typeof input === 'string' ? safeJsonParse(input, 'rawGmailQuery') : input;\n const validated = GmailQuerySchema.safeParse(raw);\n if (!validated.success) {\n throw new Error(`Invalid query JSON: ${validated.error.message}. Use {\"rawGmailQuery\":\"<query>\"} for Gmail syntax.`);\n }\n return validated.data;\n}\n\nfunction safeJsonParse(value: string, rawField: 'rawGmailQuery'): unknown {\n try {\n return JSON.parse(value);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Invalid JSON';\n throw new Error(`Query must be valid JSON. ${message}. Wrap Gmail syntax in {\"${rawField}\":\"<query>\"} if needed.`);\n }\n}\n\nexport type GmailQuery = BaseEmailQueryFields & {\n $and?: GmailQuery[];\n $or?: GmailQuery[];\n $not?: GmailQuery;\n fuzzyPhrase?: string;\n categories?:\n | 'primary'\n | 'social'\n | 'promotions'\n | 'updates'\n | 'forums'\n | {\n $any?: ('primary' | 'social' | 'promotions' | 'updates' | 'forums')[];\n $all?: ('primary' | 'social' | 'promotions' | 'updates' | 'forums')[];\n $none?: ('primary' | 'social' | 'promotions' | 'updates' | 'forums')[];\n };\n label?: string | FieldOperator;\n rawGmailQuery?: string;\n};\n"],"names":["GmailQueryParameterSchema","GmailQuerySchema","parseGmailQueryParameter","z","lazy","object","$and","array","optional","describe","$or","$not","baseEmailQueryFields","fuzzyPhrase","string","min","categories","union","enum","$any","$all","$none","strict","label","FieldOperatorSchema","rawGmailQuery","input","undefined","raw","safeJsonParse","validated","safeParse","success","Error","error","message","data","value","rawField","JSON","parse"],"mappings":";;;;;;;;;;;QAkEaA;eAAAA;;QA3CAC;eAAAA;;QA8CGC;eAAAA;;;qBArEyF;mBACvF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBX,IAAMD,mBAAmBE,MAAC,CAACC,IAAI,CAAC;WACrCD,MAAC,CACEE,MAAM,CAAC;QACN,yDAAyD;QACzDC,MAAMH,MAAC,CAACI,KAAK,CAACN,kBAAkBO,QAAQ,GAAGC,QAAQ,CAAC;QACpDC,KAAKP,MAAC,CAACI,KAAK,CAACN,kBAAkBO,QAAQ,GAAGC,QAAQ,CAAC;QACnDE,MAAMV,iBAAiBO,QAAQ,GAAGC,QAAQ,CAAC;OAGxCG,2BAAoB;QAEvB,0BAA0B;QAE1B,0EAA0E;QAC1EC,aAAaV,MAAC,CAACW,MAAM,GAAGC,GAAG,CAAC,GAAGP,QAAQ,GAAGC,QAAQ,CAAC;QAEnD,sDAAsD;QACtDO,YAAYb,MAAC,CACVc,KAAK,CAAC;YACLd,MAAC,CAACe,IAAI,CAAC;gBAAC;gBAAW;gBAAU;gBAAc;gBAAW;aAAS;YAC/Df,MAAC,CACEE,MAAM,CAAC;gBACNc,MAAMhB,MAAC,CAACI,KAAK,CAACJ,MAAC,CAACe,IAAI,CAAC;oBAAC;oBAAW;oBAAU;oBAAc;oBAAW;iBAAS,GAAGV,QAAQ;gBACxFY,MAAMjB,MAAC,CAACI,KAAK,CAACJ,MAAC,CAACe,IAAI,CAAC;oBAAC;oBAAW;oBAAU;oBAAc;oBAAW;iBAAS,GAAGV,QAAQ;gBACxFa,OAAOlB,MAAC,CAACI,KAAK,CAACJ,MAAC,CAACe,IAAI,CAAC;oBAAC;oBAAW;oBAAU;oBAAc;oBAAW;iBAAS,GAAGV,QAAQ;YAC3F,GACCc,MAAM;SACV,EACAd,QAAQ,GACRC,QAAQ,CAAC;QAEZ,sBAAsB;QACtBc,OAAOpB,MAAC,CACLc,KAAK,CAAC;YAACd,MAAC,CAACW,MAAM,GAAGC,GAAG,CAAC;YAAIS,0BAAmB;SAAC,EAC9ChB,QAAQ,GACRC,QAAQ,CAAC;QAEZ,4DAA4D;QAC5DgB,eAAetB,MAAC,CAACW,MAAM,GAAGC,GAAG,CAAC,GAAGP,QAAQ,GAAGC,QAAQ,CAAC;QAEtDa,MAAM;;AAGJ,IAAMtB,4BAA4BG,MAAC,CAACc,KAAK,CAAC;IAAChB;IAAkBE,MAAC,CAACW,MAAM,GAAGC,GAAG,CAAC;CAAG;AAG/E,SAASb,yBAAyBwB,KAAsC;IAC7E,IAAIA,UAAUC,WAAW,OAAOA;IAChC,IAAMC,MAAM,OAAOF,UAAU,WAAWG,cAAcH,OAAO,mBAAmBA;IAChF,IAAMI,YAAY7B,iBAAiB8B,SAAS,CAACH;IAC7C,IAAI,CAACE,UAAUE,OAAO,EAAE;QACtB,MAAM,IAAIC,MAAM,AAAC,uBAA8C,OAAxBH,UAAUI,KAAK,CAACC,OAAO,EAAC;IACjE;IACA,OAAOL,UAAUM,IAAI;AACvB;AAEA,SAASP,cAAcQ,KAAa,EAAEC,QAAyB;IAC7D,IAAI;QACF,OAAOC,KAAKC,KAAK,CAACH;IACpB,EAAE,OAAOH,OAAO;QACd,IAAMC,UAAUD,AAAK,YAALA,OAAiBD,SAAQC,MAAMC,OAAO,GAAG;QACzD,MAAM,IAAIF,MAAM,AAAC,6BAA+DK,OAAnCH,SAAQ,6BAAoC,OAATG,UAAS;IAC3F;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/schemas/gmail-query-schema.ts"],"sourcesContent":["import { type BaseEmailQueryFields, baseEmailQueryFields, type FieldOperator, FieldOperatorSchema } from '@mcp-z/email';\nimport { z } from 'zod';\n\n/**\n * Gmail-specific query schema with recursive operators and Gmail features.\n *\n * Includes Gmail-specific features:\n * - fuzzyPhrase: Approximate phrase matching (Gmail's quoted string behavior with relevance ranking)\n * - categories: Gmail system categories (primary, social, promotions, updates, forums)\n * - label: User-created Gmail labels (case-sensitive, discovered via gmail-labels-list)\n * - rawGmailQuery: Escape hatch for advanced Gmail query syntax\n *\n * Plus all base fields from baseEmailQueryFields:\n * - Email addresses: from, to, cc, bcc (support string or field operators)\n * - Content: subject, body, text\n * - Flags: hasAttachment, isRead\n * - Date range: date { $gte, $lt }\n * - Logical operators: $and, $or, $not (recursive)\n *\n * Note: Cast through unknown to work around Zod's lazy schema type inference issue\n * with exactOptionalPropertyTypes. The runtime schema is correct; this cast ensures\n * TypeScript sees the strict GmailQuery type everywhere the schema is used.\n */\nexport const GmailQuerySchema = z.lazy(() =>\n z\n .object({\n // Logical operators for combining conditions (recursive)\n $and: z.array(GmailQuerySchema).optional().describe('Array of conditions that must ALL match'),\n $or: z.array(GmailQuerySchema).optional().describe('Array of conditions where ANY must match'),\n $not: GmailQuerySchema.optional().describe('Nested condition that must NOT match'),\n\n // Spread base email query fields (from, to, subject, body, etc.)\n ...baseEmailQueryFields,\n\n // Gmail-specific features\n\n // Fuzzy phrase matching - Gmail's approximate search using quoted strings\n fuzzyPhrase: z.string().min(1).optional().describe('Fuzzy phrase matching - words should appear together (approximate matching). Gmail uses relevance-based matching.'),\n\n // Gmail system categories with field operator support\n categories: z\n .union([\n z.enum(['primary', 'social', 'promotions', 'updates', 'forums']),\n z\n .object({\n $any: z.array(z.enum(['primary', 'social', 'promotions', 'updates', 'forums'])).optional(),\n $all: z.array(z.enum(['primary', 'social', 'promotions', 'updates', 'forums'])).optional(),\n $none: z.array(z.enum(['primary', 'social', 'promotions', 'updates', 'forums'])).optional(),\n })\n .strict(),\n ])\n .optional()\n .describe('Filter by Gmail system categories (primary, social, promotions, updates, forums)'),\n\n // User-created labels\n label: z\n .union([z.string().min(1), FieldOperatorSchema])\n .optional()\n .describe('Filter by user-created labels (case-sensitive). Use gmail-labels-list to see available labels'),\n\n // Raw Gmail query string - escape hatch for advanced syntax\n rawGmailQuery: z.string().min(1).optional().describe('Raw Gmail query syntax for advanced use cases. Bypasses schema validation - use sparingly.'),\n })\n .strict()\n) as unknown as z.ZodType<GmailQuery>;\n\nexport const GmailQueryParameterSchema = z.union([GmailQuerySchema, z.string().min(1)]) as z.ZodType<GmailQuery | string>;\nexport type GmailQueryParameter = z.infer<typeof GmailQueryParameterSchema>;\n\nexport function parseGmailQueryParameter(input: GmailQuery | string | undefined): GmailQuery | undefined {\n if (input === undefined) return undefined;\n const raw = typeof input === 'string' ? safeJsonParse(input, 'rawGmailQuery') : input;\n const validated = GmailQuerySchema.safeParse(raw);\n if (!validated.success) {\n throw new Error(`Invalid query JSON: ${validated.error.message}. Use {\"rawGmailQuery\":\"<query>\"} for Gmail syntax.`);\n }\n return validated.data;\n}\n\nfunction safeJsonParse(value: string, rawField: 'rawGmailQuery'): unknown {\n try {\n return JSON.parse(value);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Invalid JSON';\n throw new Error(`Query must be valid JSON. ${message}. Wrap Gmail syntax in {\"${rawField}\":\"<query>\"} if needed.`);\n }\n}\n\nexport type GmailQuery = BaseEmailQueryFields & {\n $and?: GmailQuery[];\n $or?: GmailQuery[];\n $not?: GmailQuery;\n fuzzyPhrase?: string;\n categories?:\n | 'primary'\n | 'social'\n | 'promotions'\n | 'updates'\n | 'forums'\n | {\n $any?: ('primary' | 'social' | 'promotions' | 'updates' | 'forums')[];\n $all?: ('primary' | 'social' | 'promotions' | 'updates' | 'forums')[];\n $none?: ('primary' | 'social' | 'promotions' | 'updates' | 'forums')[];\n };\n label?: string | FieldOperator;\n rawGmailQuery?: string;\n};\n"],"names":["GmailQueryParameterSchema","GmailQuerySchema","parseGmailQueryParameter","z","lazy","object","$and","array","optional","describe","$or","$not","baseEmailQueryFields","fuzzyPhrase","string","min","categories","union","enum","$any","$all","$none","strict","label","FieldOperatorSchema","rawGmailQuery","input","undefined","raw","safeJsonParse","validated","safeParse","success","Error","error","message","data","value","rawField","JSON","parse"],"mappings":";;;;;;;;;;;QAkEaA;eAAAA;;QA3CAC;eAAAA;;QA8CGC;eAAAA;;;qBArEyF;mBACvF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBX,IAAMD,mBAAmBE,MAAC,CAACC,IAAI,CAAC;WACrCD,MAAC,CACEE,MAAM,CAAC;QACN,yDAAyD;QACzDC,MAAMH,MAAC,CAACI,KAAK,CAACN,kBAAkBO,QAAQ,GAAGC,QAAQ,CAAC;QACpDC,KAAKP,MAAC,CAACI,KAAK,CAACN,kBAAkBO,QAAQ,GAAGC,QAAQ,CAAC;QACnDE,MAAMV,iBAAiBO,QAAQ,GAAGC,QAAQ,CAAC;OAGxCG,2BAAoB;QAEvB,0BAA0B;QAE1B,0EAA0E;QAC1EC,aAAaV,MAAC,CAACW,MAAM,GAAGC,GAAG,CAAC,GAAGP,QAAQ,GAAGC,QAAQ,CAAC;QAEnD,sDAAsD;QACtDO,YAAYb,MAAC,CACVc,KAAK,CAAC;YACLd,MAAC,CAACe,IAAI,CAAC;gBAAC;gBAAW;gBAAU;gBAAc;gBAAW;aAAS;YAC/Df,MAAC,CACEE,MAAM,CAAC;gBACNc,MAAMhB,MAAC,CAACI,KAAK,CAACJ,MAAC,CAACe,IAAI,CAAC;oBAAC;oBAAW;oBAAU;oBAAc;oBAAW;iBAAS,GAAGV,QAAQ;gBACxFY,MAAMjB,MAAC,CAACI,KAAK,CAACJ,MAAC,CAACe,IAAI,CAAC;oBAAC;oBAAW;oBAAU;oBAAc;oBAAW;iBAAS,GAAGV,QAAQ;gBACxFa,OAAOlB,MAAC,CAACI,KAAK,CAACJ,MAAC,CAACe,IAAI,CAAC;oBAAC;oBAAW;oBAAU;oBAAc;oBAAW;iBAAS,GAAGV,QAAQ;YAC3F,GACCc,MAAM;SACV,EACAd,QAAQ,GACRC,QAAQ,CAAC;QAEZ,sBAAsB;QACtBc,OAAOpB,MAAC,CACLc,KAAK,CAAC;YAACd,MAAC,CAACW,MAAM,GAAGC,GAAG,CAAC;YAAIS,0BAAmB;SAAC,EAC9ChB,QAAQ,GACRC,QAAQ,CAAC;QAEZ,4DAA4D;QAC5DgB,eAAetB,MAAC,CAACW,MAAM,GAAGC,GAAG,CAAC,GAAGP,QAAQ,GAAGC,QAAQ,CAAC;QAEtDa,MAAM;;AAGJ,IAAMtB,4BAA4BG,MAAC,CAACc,KAAK,CAAC;IAAChB;IAAkBE,MAAC,CAACW,MAAM,GAAGC,GAAG,CAAC;CAAG;AAG/E,SAASb,yBAAyBwB,KAAsC;IAC7E,IAAIA,UAAUC,WAAW,OAAOA;IAChC,IAAMC,MAAM,OAAOF,UAAU,WAAWG,cAAcH,OAAO,mBAAmBA;IAChF,IAAMI,YAAY7B,iBAAiB8B,SAAS,CAACH;IAC7C,IAAI,CAACE,UAAUE,OAAO,EAAE;QACtB,MAAM,IAAIC,MAAM,AAAC,uBAA8C,OAAxBH,UAAUI,KAAK,CAACC,OAAO,EAAC;IACjE;IACA,OAAOL,UAAUM,IAAI;AACvB;AAEA,SAASP,cAAcQ,KAAa,EAAEC,QAAyB;IAC7D,IAAI;QACF,OAAOC,KAAKC,KAAK,CAACH;IACpB,EAAE,OAAOH,OAAO;QACd,IAAMC,UAAUD,AAAK,YAALA,OAAiBD,SAAQC,MAAMC,OAAO,GAAG;QACzD,MAAM,IAAIF,MAAM,AAAC,6BAA+DK,OAAnCH,SAAQ,6BAAoC,OAATG,UAAS;IAC3F;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/schemas/index.ts"],"sourcesContent":["export * from './gmail-query-schema.ts';\n"],"names":[],"mappings":";;;;qBAAc"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/schemas/index.ts"],"sourcesContent":["export * from './gmail-query-schema.ts';\n"],"names":[],"mappings":";;;;qBAAc"}
@@ -36,9 +36,7 @@ function _define_property(obj, key, value) {
36
36
  configurable: true,
37
37
  writable: true
38
38
  });
39
- } else {
40
- obj[key] = value;
41
- }
39
+ } else obj[key] = value;
42
40
  return obj;
43
41
  }
44
42
  function _interop_require_default(obj) {
@@ -55,18 +53,12 @@ function _getRequireWildcardCache(nodeInterop) {
55
53
  })(nodeInterop);
56
54
  }
57
55
  function _interop_require_wildcard(obj, nodeInterop) {
58
- if (!nodeInterop && obj && obj.__esModule) {
59
- return obj;
60
- }
61
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
62
- return {
63
- default: obj
64
- };
65
- }
56
+ if (!nodeInterop && obj && obj.__esModule) return obj;
57
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") return {
58
+ default: obj
59
+ };
66
60
  var cache = _getRequireWildcardCache(nodeInterop);
67
- if (cache && cache.has(obj)) {
68
- return cache.get(obj);
69
- }
61
+ if (cache && cache.has(obj)) return cache.get(obj);
70
62
  var newObj = {
71
63
  __proto__: null
72
64
  };
@@ -74,17 +66,12 @@ function _interop_require_wildcard(obj, nodeInterop) {
74
66
  for(var key in obj){
75
67
  if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
76
68
  var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
77
- if (desc && (desc.get || desc.set)) {
78
- Object.defineProperty(newObj, key, desc);
79
- } else {
80
- newObj[key] = obj[key];
81
- }
69
+ if (desc && (desc.get || desc.set)) Object.defineProperty(newObj, key, desc);
70
+ else newObj[key] = obj[key];
82
71
  }
83
72
  }
84
73
  newObj.default = obj;
85
- if (cache) {
86
- cache.set(obj, newObj);
87
- }
74
+ if (cache) cache.set(obj, newObj);
88
75
  return newObj;
89
76
  }
90
77
  function _object_spread(target) {
@@ -117,9 +104,8 @@ function ownKeys(object, enumerableOnly) {
117
104
  }
118
105
  function _object_spread_props(target, source) {
119
106
  source = source != null ? source : {};
120
- if (Object.getOwnPropertyDescriptors) {
121
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
122
- } else {
107
+ if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
108
+ else {
123
109
  ownKeys(Object(source)).forEach(function(key) {
124
110
  Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
125
111
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/setup/config.ts"],"sourcesContent":["import { parseDcrConfig, parseConfig as parseOAuthConfig } from '@mcp-z/oauth-google';\nimport { findConfigPath, parseConfig as parseTransportConfig } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport { homedir } from 'os';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { parseArgs } from 'util';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\nconst pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));\n\nconst HELP_TEXT = `\nUsage: mcp-gmail [options]\n\nMCP server for Gmail email management with OAuth authentication.\n\nOptions:\n --version Show version number\n --help Show this help message\n --auth=<mode> Authentication mode (default: loopback-oauth)\n Modes: loopback-oauth, service-account, dcr\n --headless Disable browser auto-open, return auth URL instead\n --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n --dcr-verify-url=<url> External verification endpoint (required for external mode)\n --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n --port=<port> Enable HTTP transport on specified port\n --stdio Enable stdio transport (default if no port)\n --log-level=<level> Logging level (default: info)\n --resource-store-uri=<uri> Resource store URI for CSV file storage (default: file://~/.mcp-z/mcp-gmail/files)\n --base-url=<url> Base URL for HTTP file serving (optional)\n\nEnvironment Variables:\n GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n GOOGLE_CLIENT_SECRET OAuth client secret (optional)\n AUTH_MODE Default authentication mode (optional)\n HEADLESS Disable browser auto-open (optional)\n DCR_MODE DCR mode (optional, same format as --dcr-mode)\n DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n TOKEN_STORE_URI Token storage URI (optional)\n PORT Default HTTP port (optional)\n LOG_LEVEL Default logging level (optional)\n RESOURCE_STORE_URI Resource store URI (optional, file://)\n BASE_URL Default base URL for file serving (optional)\n\nOAuth Scopes:\n openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\n\nExamples:\n mcp-gmail # Use default settings\n mcp-gmail --auth=service-account # Use service account auth\n mcp-gmail --port=3000 # HTTP transport on port 3000\n mcp-gmail --resource-store-uri=file:///tmp/emails # Custom resource store URI\n GOOGLE_CLIENT_ID=xxx mcp-gmail # Set client ID via env var\n`.trim();\n\n/**\n * Handle --version and --help flags before config parsing.\n * These should work without requiring any configuration.\n */\nexport function handleVersionHelp(args: string[]): { handled: boolean; output?: string } {\n const { values } = parseArgs({\n args,\n options: {\n version: { type: 'boolean' },\n help: { type: 'boolean' },\n },\n strict: false,\n });\n\n if (values.version) return { handled: true, output: pkg.version };\n if (values.help) return { handled: true, output: HELP_TEXT };\n return { handled: false };\n}\n\n/**\n * Parse Gmail server configuration from CLI arguments and environment.\n *\n * CLI Arguments (all optional):\n * - --auth=<mode> Authentication mode (default: loopback-oauth)\n * Modes: loopback-oauth, service-account, dcr\n * - --headless Disable browser auto-open, return auth URL instead\n * - --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n * - --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n * - --dcr-verify-url=<url> External verification endpoint (required for external mode)\n * - --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n * - --port=<port> Enable HTTP transport on specified port\n * - --stdio Enable stdio transport (default if no port)\n * - --log-level=<level> Logging level (default: info)\n * - --resource-store-uri=<uri> Resource store URI for CSV file storage (default: file://~/.mcp-z/mcp-gmail/files)\n * - --base-url=<url> Base URL for HTTP file serving (optional)\n *\n * Environment Variables:\n * - GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n * - GOOGLE_CLIENT_SECRET OAuth client secret (optional)\n * - AUTH_MODE Default authentication mode (optional)\n * - HEADLESS Disable browser auto-open (optional)\n * - DCR_MODE DCR mode (optional, same format as --dcr-mode)\n * - DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n * - DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n * - TOKEN_STORE_URI Token storage URI (optional)\n * - PORT Default HTTP port (optional)\n * - LOG_LEVEL Default logging level (optional)\n * - RESOURCE_STORE_URI Resource store URI (optional, file://)\n * - BASE_URL Default base URL for file serving (optional)\n *\n * OAuth Scopes (from constants.ts):\n * openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\n */\nexport function parseConfig(args: string[], env: Record<string, string | undefined>): ServerConfig {\n const transportConfig = parseTransportConfig(args, env);\n const oauthConfig = parseOAuthConfig(args, env);\n\n // Parse DCR configuration if DCR mode is enabled\n const dcrConfig = oauthConfig.auth === 'dcr' ? parseDcrConfig(args, env, GOOGLE_SCOPE) : undefined;\n\n // Parse application-level config (LOG_LEVEL, RESOURCE_STORE_URI, BASE_URL)\n const { values } = parseArgs({\n args,\n options: {\n 'log-level': { type: 'string' },\n 'base-url': { type: 'string' },\n 'resource-store-uri': { type: 'string' },\n },\n strict: false, // Allow other arguments\n allowPositionals: true,\n });\n\n const name = pkg.name.replace(/^@[^/]+\\//, '');\n // Parse repository URL from package.json, stripping git+ prefix and .git suffix\n const rawRepoUrl = typeof pkg.repository === 'object' ? pkg.repository.url : pkg.repository;\n const repositoryUrl = rawRepoUrl?.replace(/^git\\+/, '').replace(/\\.git$/, '') ?? `https://github.com/mcp-z/${name}`;\n let rootDir = homedir();\n try {\n const configPath = findConfigPath({ config: '.mcp.json', cwd: process.cwd(), stopDir: homedir() });\n rootDir = path.dirname(configPath);\n } catch {\n rootDir = homedir();\n }\n const baseDir = path.join(rootDir, '.mcp-z');\n const cliLogLevel = typeof values['log-level'] === 'string' ? values['log-level'] : undefined;\n const envLogLevel = env.LOG_LEVEL;\n const logLevel = cliLogLevel ?? envLogLevel ?? 'info';\n\n // Parse storage configuration\n const cliResourceStoreUri = typeof values['resource-store-uri'] === 'string' ? values['resource-store-uri'] : undefined;\n const envResourceStoreUri = env.RESOURCE_STORE_URI;\n const defaultResourceStorePath = path.join(baseDir, name, 'files');\n const resourceStoreUri = normalizeResourceStoreUri(cliResourceStoreUri ?? envResourceStoreUri ?? defaultResourceStorePath);\n\n const cliBaseUrl = typeof values['base-url'] === 'string' ? values['base-url'] : undefined;\n const envBaseUrl = env.BASE_URL;\n const baseUrl = cliBaseUrl ?? envBaseUrl;\n\n // Combine configs\n const result: ServerConfig = {\n ...oauthConfig, // Includes clientId, auth, headless, redirectUri, serviceAccountKeyFile\n transport: transportConfig.transport,\n logLevel,\n baseDir,\n name,\n version: pkg.version,\n repositoryUrl,\n resourceStoreUri,\n };\n if (baseUrl) result.baseUrl = baseUrl;\n if (dcrConfig !== undefined) result.dcrConfig = dcrConfig;\n return result;\n}\n\n/**\n * Build production configuration from process globals.\n * Entry point for production server.\n */\nexport function createConfig(): ServerConfig {\n return parseConfig(process.argv, process.env);\n}\n\nfunction normalizeResourceStoreUri(resourceStoreUri: string): string {\n const filePrefix = 'file://';\n if (resourceStoreUri.startsWith(filePrefix)) {\n const rawPath = resourceStoreUri.slice(filePrefix.length);\n const expandedPath = rawPath.startsWith('~') ? rawPath.replace(/^~/, homedir()) : rawPath;\n return `${filePrefix}${path.resolve(expandedPath)}`;\n }\n\n if (resourceStoreUri.includes('://')) return resourceStoreUri;\n\n const expandedPath = resourceStoreUri.startsWith('~') ? resourceStoreUri.replace(/^~/, homedir()) : resourceStoreUri;\n return `${filePrefix}${path.resolve(expandedPath)}`;\n}\n"],"names":["createConfig","handleVersionHelp","parseConfig","pkg","JSON","parse","fs","readFileSync","path","join","moduleRoot","url","fileURLToPath","HELP_TEXT","trim","args","values","parseArgs","options","version","type","help","strict","handled","output","env","cliLogLevel","cliResourceStoreUri","transportConfig","parseTransportConfig","oauthConfig","parseOAuthConfig","dcrConfig","auth","parseDcrConfig","GOOGLE_SCOPE","undefined","allowPositionals","name","replace","rawRepoUrl","repository","repositoryUrl","rootDir","homedir","configPath","findConfigPath","config","cwd","process","stopDir","dirname","baseDir","envLogLevel","LOG_LEVEL","logLevel","envResourceStoreUri","RESOURCE_STORE_URI","defaultResourceStorePath","resourceStoreUri","normalizeResourceStoreUri","cliBaseUrl","envBaseUrl","BASE_URL","baseUrl","result","transport","argv","filePrefix","startsWith","rawPath","slice","length","expandedPath","resolve","includes"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/setup/config.ts"],"sourcesContent":["import { parseDcrConfig, parseConfig as parseOAuthConfig } from '@mcp-z/oauth-google';\nimport { findConfigPath, parseConfig as parseTransportConfig } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport { homedir } from 'os';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { parseArgs } from 'util';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\nconst pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));\n\nconst HELP_TEXT = `\nUsage: mcp-gmail [options]\n\nMCP server for Gmail email management with OAuth authentication.\n\nOptions:\n --version Show version number\n --help Show this help message\n --auth=<mode> Authentication mode (default: loopback-oauth)\n Modes: loopback-oauth, service-account, dcr\n --headless Disable browser auto-open, return auth URL instead\n --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n --dcr-verify-url=<url> External verification endpoint (required for external mode)\n --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n --port=<port> Enable HTTP transport on specified port\n --stdio Enable stdio transport (default if no port)\n --log-level=<level> Logging level (default: info)\n --resource-store-uri=<uri> Resource store URI for CSV file storage (default: file://~/.mcp-z/mcp-gmail/files)\n --base-url=<url> Base URL for HTTP file serving (optional)\n\nEnvironment Variables:\n GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n GOOGLE_CLIENT_SECRET OAuth client secret (optional)\n AUTH_MODE Default authentication mode (optional)\n HEADLESS Disable browser auto-open (optional)\n DCR_MODE DCR mode (optional, same format as --dcr-mode)\n DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n TOKEN_STORE_URI Token storage URI (optional)\n PORT Default HTTP port (optional)\n LOG_LEVEL Default logging level (optional)\n RESOURCE_STORE_URI Resource store URI (optional, file://)\n BASE_URL Default base URL for file serving (optional)\n\nOAuth Scopes:\n openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\n\nExamples:\n mcp-gmail # Use default settings\n mcp-gmail --auth=service-account # Use service account auth\n mcp-gmail --port=3000 # HTTP transport on port 3000\n mcp-gmail --resource-store-uri=file:///tmp/emails # Custom resource store URI\n GOOGLE_CLIENT_ID=xxx mcp-gmail # Set client ID via env var\n`.trim();\n\n/**\n * Handle --version and --help flags before config parsing.\n * These should work without requiring any configuration.\n */\nexport function handleVersionHelp(args: string[]): { handled: boolean; output?: string } {\n const { values } = parseArgs({\n args,\n options: {\n version: { type: 'boolean' },\n help: { type: 'boolean' },\n },\n strict: false,\n });\n\n if (values.version) return { handled: true, output: pkg.version };\n if (values.help) return { handled: true, output: HELP_TEXT };\n return { handled: false };\n}\n\n/**\n * Parse Gmail server configuration from CLI arguments and environment.\n *\n * CLI Arguments (all optional):\n * - --auth=<mode> Authentication mode (default: loopback-oauth)\n * Modes: loopback-oauth, service-account, dcr\n * - --headless Disable browser auto-open, return auth URL instead\n * - --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n * - --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n * - --dcr-verify-url=<url> External verification endpoint (required for external mode)\n * - --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n * - --port=<port> Enable HTTP transport on specified port\n * - --stdio Enable stdio transport (default if no port)\n * - --log-level=<level> Logging level (default: info)\n * - --resource-store-uri=<uri> Resource store URI for CSV file storage (default: file://~/.mcp-z/mcp-gmail/files)\n * - --base-url=<url> Base URL for HTTP file serving (optional)\n *\n * Environment Variables:\n * - GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n * - GOOGLE_CLIENT_SECRET OAuth client secret (optional)\n * - AUTH_MODE Default authentication mode (optional)\n * - HEADLESS Disable browser auto-open (optional)\n * - DCR_MODE DCR mode (optional, same format as --dcr-mode)\n * - DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n * - DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n * - TOKEN_STORE_URI Token storage URI (optional)\n * - PORT Default HTTP port (optional)\n * - LOG_LEVEL Default logging level (optional)\n * - RESOURCE_STORE_URI Resource store URI (optional, file://)\n * - BASE_URL Default base URL for file serving (optional)\n *\n * OAuth Scopes (from constants.ts):\n * openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\n */\nexport function parseConfig(args: string[], env: Record<string, string | undefined>): ServerConfig {\n const transportConfig = parseTransportConfig(args, env);\n const oauthConfig = parseOAuthConfig(args, env);\n\n // Parse DCR configuration if DCR mode is enabled\n const dcrConfig = oauthConfig.auth === 'dcr' ? parseDcrConfig(args, env, GOOGLE_SCOPE) : undefined;\n\n // Parse application-level config (LOG_LEVEL, RESOURCE_STORE_URI, BASE_URL)\n const { values } = parseArgs({\n args,\n options: {\n 'log-level': { type: 'string' },\n 'base-url': { type: 'string' },\n 'resource-store-uri': { type: 'string' },\n },\n strict: false, // Allow other arguments\n allowPositionals: true,\n });\n\n const name = pkg.name.replace(/^@[^/]+\\//, '');\n // Parse repository URL from package.json, stripping git+ prefix and .git suffix\n const rawRepoUrl = typeof pkg.repository === 'object' ? pkg.repository.url : pkg.repository;\n const repositoryUrl = rawRepoUrl?.replace(/^git\\+/, '').replace(/\\.git$/, '') ?? `https://github.com/mcp-z/${name}`;\n let rootDir = homedir();\n try {\n const configPath = findConfigPath({ config: '.mcp.json', cwd: process.cwd(), stopDir: homedir() });\n rootDir = path.dirname(configPath);\n } catch {\n rootDir = homedir();\n }\n const baseDir = path.join(rootDir, '.mcp-z');\n const cliLogLevel = typeof values['log-level'] === 'string' ? values['log-level'] : undefined;\n const envLogLevel = env.LOG_LEVEL;\n const logLevel = cliLogLevel ?? envLogLevel ?? 'info';\n\n // Parse storage configuration\n const cliResourceStoreUri = typeof values['resource-store-uri'] === 'string' ? values['resource-store-uri'] : undefined;\n const envResourceStoreUri = env.RESOURCE_STORE_URI;\n const defaultResourceStorePath = path.join(baseDir, name, 'files');\n const resourceStoreUri = normalizeResourceStoreUri(cliResourceStoreUri ?? envResourceStoreUri ?? defaultResourceStorePath);\n\n const cliBaseUrl = typeof values['base-url'] === 'string' ? values['base-url'] : undefined;\n const envBaseUrl = env.BASE_URL;\n const baseUrl = cliBaseUrl ?? envBaseUrl;\n\n // Combine configs\n const result: ServerConfig = {\n ...oauthConfig, // Includes clientId, auth, headless, redirectUri, serviceAccountKeyFile\n transport: transportConfig.transport,\n logLevel,\n baseDir,\n name,\n version: pkg.version,\n repositoryUrl,\n resourceStoreUri,\n };\n if (baseUrl) result.baseUrl = baseUrl;\n if (dcrConfig !== undefined) result.dcrConfig = dcrConfig;\n return result;\n}\n\n/**\n * Build production configuration from process globals.\n * Entry point for production server.\n */\nexport function createConfig(): ServerConfig {\n return parseConfig(process.argv, process.env);\n}\n\nfunction normalizeResourceStoreUri(resourceStoreUri: string): string {\n const filePrefix = 'file://';\n if (resourceStoreUri.startsWith(filePrefix)) {\n const rawPath = resourceStoreUri.slice(filePrefix.length);\n const expandedPath = rawPath.startsWith('~') ? rawPath.replace(/^~/, homedir()) : rawPath;\n return `${filePrefix}${path.resolve(expandedPath)}`;\n }\n\n if (resourceStoreUri.includes('://')) return resourceStoreUri;\n\n const expandedPath = resourceStoreUri.startsWith('~') ? resourceStoreUri.replace(/^~/, homedir()) : resourceStoreUri;\n return `${filePrefix}${path.resolve(expandedPath)}`;\n}\n"],"names":["createConfig","handleVersionHelp","parseConfig","pkg","JSON","parse","fs","readFileSync","path","join","moduleRoot","url","fileURLToPath","HELP_TEXT","trim","args","values","parseArgs","options","version","type","help","strict","handled","output","env","cliLogLevel","cliResourceStoreUri","transportConfig","parseTransportConfig","oauthConfig","parseOAuthConfig","dcrConfig","auth","parseDcrConfig","GOOGLE_SCOPE","undefined","allowPositionals","name","replace","rawRepoUrl","repository","repositoryUrl","rootDir","homedir","configPath","findConfigPath","config","cwd","process","stopDir","dirname","baseDir","envLogLevel","LOG_LEVEL","logLevel","envResourceStoreUri","RESOURCE_STORE_URI","defaultResourceStorePath","resourceStoreUri","normalizeResourceStoreUri","cliBaseUrl","envBaseUrl","BASE_URL","baseUrl","result","transport","argv","filePrefix","startsWith","rawPath","slice","length","expandedPath","resolve","includes"],"mappings":"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"}
@@ -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
- resolve(value);
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() {
@@ -56,22 +53,16 @@ function _interop_require_default(obj) {
56
53
  };
57
54
  }
58
55
  function _iterable_to_array(iter) {
59
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
56
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) {
57
+ return Array.from(iter);
58
+ }
60
59
  }
61
60
  function _non_iterable_spread() {
62
- throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
61
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
63
62
  }
64
63
  function _to_consumable_array(arr) {
65
64
  return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
66
65
  }
67
- function _unsupported_iterable_to_array(o, minLen) {
68
- if (!o) return;
69
- if (typeof o === "string") return _array_like_to_array(o, minLen);
70
- var n = Object.prototype.toString.call(o).slice(8, -1);
71
- if (n === "Object" && o.constructor) n = o.constructor.name;
72
- if (n === "Map" || n === "Set") return Array.from(n);
73
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
74
- }
75
66
  function _ts_generator(thisArg, body) {
76
67
  var f, y, t, _ = {
77
68
  label: 0,
@@ -171,6 +162,14 @@ function _ts_generator(thisArg, body) {
171
162
  };
172
163
  }
173
164
  }
165
+ function _unsupported_iterable_to_array(o, minLen) {
166
+ if (!o) return;
167
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
168
+ var n = Object.prototype.toString.call(o).slice(8, -1);
169
+ if (n === "Object" && o.constructor) n = o.constructor.name;
170
+ if (n === "Map" || n === "Set") return Array.from(n);
171
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
172
+ }
174
173
  function createHTTPServer(config, overrides) {
175
174
  return _async_to_generator(function() {
176
175
  var runtime, modules, layers, composed, logger, port, tools, filteredTools, prompts, mcpServer, app, fileRouter, _ref, close, httpServer;
@@ -244,7 +243,7 @@ function createHTTPServer(config, overrides) {
244
243
  httpServer: httpServer,
245
244
  mcpServer: mcpServer,
246
245
  logger: logger,
247
- close: function() {
246
+ close: function close1() {
248
247
  return _async_to_generator(function() {
249
248
  return _ts_generator(this, function(_state) {
250
249
  switch(_state.label){