@mcp-z/mcp-gmail 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/cjs/email/messages/fetch-message.d.cts +1 -1
  2. package/dist/cjs/email/messages/fetch-message.d.ts +1 -1
  3. package/dist/cjs/email/messages/fetch-message.js.map +1 -1
  4. package/dist/cjs/email/messages/messages.d.cts +1 -1
  5. package/dist/cjs/email/messages/messages.d.ts +1 -1
  6. package/dist/cjs/email/messages/messages.js.map +1 -1
  7. package/dist/cjs/email/parsing/html-processing.d.cts +1 -1
  8. package/dist/cjs/email/parsing/html-processing.d.ts +1 -1
  9. package/dist/cjs/email/parsing/html-processing.js.map +1 -1
  10. package/dist/cjs/email/querying/execute-query.d.cts +1 -1
  11. package/dist/cjs/email/querying/execute-query.d.ts +1 -1
  12. package/dist/cjs/email/querying/execute-query.js.map +1 -1
  13. package/dist/cjs/email/querying/pagination.d.cts +1 -1
  14. package/dist/cjs/email/querying/pagination.d.ts +1 -1
  15. package/dist/cjs/email/querying/pagination.js.map +1 -1
  16. package/dist/cjs/email/querying/search-execution.d.cts +1 -1
  17. package/dist/cjs/email/querying/search-execution.d.ts +1 -1
  18. package/dist/cjs/email/querying/search-execution.js.map +1 -1
  19. package/dist/cjs/index.js.map +1 -1
  20. package/dist/cjs/labels/gmail-labels.d.cts +1 -1
  21. package/dist/cjs/labels/gmail-labels.d.ts +1 -1
  22. package/dist/cjs/labels/gmail-labels.js.map +1 -1
  23. package/dist/cjs/lib/google-auth.d.cts +9 -0
  24. package/dist/cjs/lib/google-auth.d.ts +9 -0
  25. package/dist/cjs/lib/google-auth.js +16 -0
  26. package/dist/cjs/lib/google-auth.js.map +1 -0
  27. package/dist/cjs/mcp/prompts/draft-email.d.cts +2 -3
  28. package/dist/cjs/mcp/prompts/draft-email.d.ts +2 -3
  29. package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
  30. package/dist/cjs/mcp/prompts/query-syntax.d.cts +2 -3
  31. package/dist/cjs/mcp/prompts/query-syntax.d.ts +2 -3
  32. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
  33. package/dist/cjs/mcp/resources/email.d.cts +6 -5
  34. package/dist/cjs/mcp/resources/email.d.ts +6 -5
  35. package/dist/cjs/mcp/resources/email.js +6 -5
  36. package/dist/cjs/mcp/resources/email.js.map +1 -1
  37. package/dist/cjs/mcp/tools/categories-list.js +6 -5
  38. package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
  39. package/dist/cjs/mcp/tools/label-add.js +7 -6
  40. package/dist/cjs/mcp/tools/label-add.js.map +1 -1
  41. package/dist/cjs/mcp/tools/label-delete.js +10 -9
  42. package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
  43. package/dist/cjs/mcp/tools/labels-list.d.cts +3 -3
  44. package/dist/cjs/mcp/tools/labels-list.d.ts +3 -3
  45. package/dist/cjs/mcp/tools/labels-list.js +6 -5
  46. package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
  47. package/dist/cjs/mcp/tools/message-get.js +7 -7
  48. package/dist/cjs/mcp/tools/message-get.js.map +1 -1
  49. package/dist/cjs/mcp/tools/message-mark-read.js +7 -6
  50. package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
  51. package/dist/cjs/mcp/tools/message-move-to-trash.js +10 -9
  52. package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
  53. package/dist/cjs/mcp/tools/message-respond.js +8 -7
  54. package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
  55. package/dist/cjs/mcp/tools/message-search.js +6 -6
  56. package/dist/cjs/mcp/tools/message-search.js.map +1 -1
  57. package/dist/cjs/mcp/tools/message-send.js +7 -6
  58. package/dist/cjs/mcp/tools/message-send.js.map +1 -1
  59. package/dist/cjs/mcp/tools/messages-export-csv.js +5 -5
  60. package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
  61. package/dist/cjs/setup/http.d.cts +0 -2
  62. package/dist/cjs/setup/http.d.ts +0 -2
  63. package/dist/cjs/setup/http.js +18 -11
  64. package/dist/cjs/setup/http.js.map +1 -1
  65. package/dist/cjs/setup/stdio.d.cts +0 -2
  66. package/dist/cjs/setup/stdio.d.ts +0 -2
  67. package/dist/cjs/setup/stdio.js +18 -11
  68. package/dist/cjs/setup/stdio.js.map +1 -1
  69. package/dist/esm/email/messages/fetch-message.d.ts +1 -1
  70. package/dist/esm/email/messages/fetch-message.js.map +1 -1
  71. package/dist/esm/email/messages/messages.d.ts +1 -1
  72. package/dist/esm/email/messages/messages.js.map +1 -1
  73. package/dist/esm/email/parsing/html-processing.d.ts +1 -1
  74. package/dist/esm/email/parsing/html-processing.js.map +1 -1
  75. package/dist/esm/email/querying/execute-query.d.ts +1 -1
  76. package/dist/esm/email/querying/execute-query.js.map +1 -1
  77. package/dist/esm/email/querying/pagination.d.ts +1 -1
  78. package/dist/esm/email/querying/pagination.js.map +1 -1
  79. package/dist/esm/email/querying/search-execution.d.ts +1 -1
  80. package/dist/esm/email/querying/search-execution.js.map +1 -1
  81. package/dist/esm/index.js +1 -1
  82. package/dist/esm/index.js.map +1 -1
  83. package/dist/esm/labels/gmail-labels.d.ts +1 -1
  84. package/dist/esm/labels/gmail-labels.js.map +1 -1
  85. package/dist/esm/lib/google-auth.d.ts +9 -0
  86. package/dist/esm/lib/google-auth.js +11 -0
  87. package/dist/esm/lib/google-auth.js.map +1 -0
  88. package/dist/esm/mcp/prompts/draft-email.d.ts +2 -3
  89. package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
  90. package/dist/esm/mcp/prompts/query-syntax.d.ts +2 -3
  91. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
  92. package/dist/esm/mcp/resources/email.d.ts +6 -5
  93. package/dist/esm/mcp/resources/email.js +5 -4
  94. package/dist/esm/mcp/resources/email.js.map +1 -1
  95. package/dist/esm/mcp/tools/categories-list.js +6 -5
  96. package/dist/esm/mcp/tools/categories-list.js.map +1 -1
  97. package/dist/esm/mcp/tools/label-add.js +7 -6
  98. package/dist/esm/mcp/tools/label-add.js.map +1 -1
  99. package/dist/esm/mcp/tools/label-delete.js +10 -9
  100. package/dist/esm/mcp/tools/label-delete.js.map +1 -1
  101. package/dist/esm/mcp/tools/labels-list.d.ts +3 -3
  102. package/dist/esm/mcp/tools/labels-list.js +6 -5
  103. package/dist/esm/mcp/tools/labels-list.js.map +1 -1
  104. package/dist/esm/mcp/tools/message-get.js +8 -8
  105. package/dist/esm/mcp/tools/message-get.js.map +1 -1
  106. package/dist/esm/mcp/tools/message-mark-read.js +7 -6
  107. package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
  108. package/dist/esm/mcp/tools/message-move-to-trash.js +10 -9
  109. package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
  110. package/dist/esm/mcp/tools/message-respond.js +8 -7
  111. package/dist/esm/mcp/tools/message-respond.js.map +1 -1
  112. package/dist/esm/mcp/tools/message-search.js +6 -5
  113. package/dist/esm/mcp/tools/message-search.js.map +1 -1
  114. package/dist/esm/mcp/tools/message-send.js +7 -6
  115. package/dist/esm/mcp/tools/message-send.js.map +1 -1
  116. package/dist/esm/mcp/tools/messages-export-csv.js +6 -6
  117. package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
  118. package/dist/esm/setup/http.d.ts +0 -2
  119. package/dist/esm/setup/http.js +18 -11
  120. package/dist/esm/setup/http.js.map +1 -1
  121. package/dist/esm/setup/stdio.d.ts +0 -2
  122. package/dist/esm/setup/stdio.js +18 -11
  123. package/dist/esm/setup/stdio.js.map +1 -1
  124. package/package.json +9 -10
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-get.ts"],"sourcesContent":["import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, type EmailDetail, EmailDetailSchema, ExcludeThreadHistorySchema } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { createFieldsSchema, filterFields, parseFields, type ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { type gmail_v1, google } from 'googleapis';\nimport { z } from 'zod';\nimport { extractBodyFromPayload, extractEmails, extractFrom } from '../../email/parsing/message-extraction.ts';\nimport { toIsoUtc } from '../../lib/date-conversion.ts';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to retrieve'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n item: EmailDetailSchema,\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Get a Gmail message by ID with flexible field selection',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, fields, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n\n logger.info('gmail.message.get called', { id: Boolean(id), fields: fields || 'all' });\n\n try {\n if (!id) {\n throw new McpError(ErrorCode.InvalidParams, 'Missing id');\n }\n\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n const response = await gmail.users.messages.get({\n userId: 'me',\n id: id,\n format: 'full',\n metadataHeaders: ['From', 'To', 'Cc', 'Bcc', 'Subject', 'Date'],\n });\n const fullData = response.data;\n if (!fullData) {\n throw new McpError(ErrorCode.InvalidRequest, 'Message not found');\n }\n\n // Build full message data with type guards\n const headers = fullData?.payload?.headers;\n const headersArray = Array.isArray(headers) ? headers : [];\n const headersMap: Record<string, string> = Object.fromEntries(\n headersArray.map((h: unknown) => {\n const header = h as gmail_v1.Schema$MessagePartHeader;\n return [String(header.name ?? ''), String(header.value ?? '')];\n })\n );\n const fromInfo = extractFrom(headersMap.From);\n const toStr = extractEmails(headersMap.To).join(', ');\n const ccStr = extractEmails(headersMap.Cc).join(', ');\n const bccStr = extractEmails(headersMap.Bcc).join(', ');\n const messagePayload = fullData?.payload;\n const bodyContent = messagePayload ? extractBodyFromPayload(messagePayload, { contentType, excludeThreadHistory }) : '';\n const payload: Partial<EmailDetail> = {\n id: fullData.id ?? undefined,\n threadId: fullData.threadId ?? undefined,\n date: toIsoUtc(headersMap.Date) || headersMap.Date,\n from: fromInfo?.address || headersMap.From,\n fromName: fromInfo?.name,\n to: toStr,\n cc: ccStr,\n bcc: bccStr,\n subject: headersMap.Subject ?? '',\n snippet: fullData.snippet ?? undefined,\n body: bodyContent,\n bodyContentType: contentType,\n };\n\n // Filter based on requested fields\n const filteredPayload = filterFields(payload, requestedFields);\n\n logger.info('gmail.message.get result', { id: fullData.id, subject: payload.subject, from: payload.from, fields: fields || 'all' });\n\n const result: Output = {\n type: 'success' as const,\n item: filteredPayload,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.message.get error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error getting message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-get',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","fields","createFieldsSchema","availableFields","EMAIL_FIELDS","fieldDescriptions","EMAIL_FIELD_DESCRIPTIONS","commonPatterns","EMAIL_COMMON_PATTERNS","resourceName","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successBranchSchema","type","literal","item","EmailDetailSchema","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","requestedFields","fullData","headersMap","gmail","response","headers","headersArray","fromInfo","toStr","ccStr","bccStr","messagePayload","bodyContent","payload","filteredPayload","error","message","parseFields","info","Boolean","McpError","ErrorCode","InvalidParams","google","version","auth","authContext","users","messages","get","userId","format","metadataHeaders","data","InvalidRequest","Array","isArray","Object","fromEntries","map","h","header","String","name","value","extractFrom","From","extractEmails","To","join","Cc","Bcc","extractBodyFromPayload","undefined","threadId","date","toIsoUtc","Date","from","address","fromName","to","cc","bcc","subject","Subject","snippet","body","bodyContentType","filterFields","content","text","JSON","stringify","structuredContent","Error","InternalError","stack"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-get.ts"],"sourcesContent":["import { type gmail_v1, gmail as gmailApi } from '@googleapis/gmail';\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, filterFields, ProtocolError, ProtocolErrorCode, parseFields, type ToolModule } from '@mcp-z/server';\nimport { z } from 'zod';\nimport { extractBodyFromPayload, extractEmails, extractFrom } from '../../email/parsing/message-extraction.ts';\nimport { toIsoUtc } from '../../lib/date-conversion.ts';\nimport { googleAuth } from '../../lib/google-auth.ts';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to retrieve'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n item: EmailDetailSchema,\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Get a Gmail message by ID with flexible field selection',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, fields, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n\n logger.info('gmail.message.get called', { id: Boolean(id), fields: fields || 'all' });\n\n try {\n if (!id) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id');\n }\n\n const gmail = gmailApi({ version: 'v1', auth: googleAuth(extra.authContext.auth) });\n const response = await gmail.users.messages.get({\n userId: 'me',\n id: id,\n format: 'full',\n metadataHeaders: ['From', 'To', 'Cc', 'Bcc', 'Subject', 'Date'],\n });\n const fullData = response.data;\n if (!fullData) {\n throw new ProtocolError(ProtocolErrorCode.InvalidRequest, 'Message not found');\n }\n\n // Build full message data with type guards\n const headers = fullData?.payload?.headers;\n const headersArray = Array.isArray(headers) ? headers : [];\n const headersMap: Record<string, string> = Object.fromEntries(\n headersArray.map((h: unknown) => {\n const header = h as gmail_v1.Schema$MessagePartHeader;\n return [String(header.name ?? ''), String(header.value ?? '')];\n })\n );\n const fromInfo = extractFrom(headersMap.From);\n const toStr = extractEmails(headersMap.To).join(', ');\n const ccStr = extractEmails(headersMap.Cc).join(', ');\n const bccStr = extractEmails(headersMap.Bcc).join(', ');\n const messagePayload = fullData?.payload;\n const bodyContent = messagePayload ? extractBodyFromPayload(messagePayload, { contentType, excludeThreadHistory }) : '';\n const payload: Partial<EmailDetail> = {\n id: fullData.id ?? undefined,\n threadId: fullData.threadId ?? undefined,\n date: toIsoUtc(headersMap.Date) || headersMap.Date,\n from: fromInfo?.address || headersMap.From,\n fromName: fromInfo?.name,\n to: toStr,\n cc: ccStr,\n bcc: bccStr,\n subject: headersMap.Subject ?? '',\n snippet: fullData.snippet ?? undefined,\n body: bodyContent,\n bodyContentType: contentType,\n };\n\n // Filter based on requested fields\n const filteredPayload = filterFields(payload, requestedFields);\n\n logger.info('gmail.message.get result', { id: fullData.id, subject: payload.subject, from: payload.from, fields: fields || 'all' });\n\n const result: Output = {\n type: 'success' as const,\n item: filteredPayload,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.message.get error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error getting message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-get',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","fields","createFieldsSchema","availableFields","EMAIL_FIELDS","fieldDescriptions","EMAIL_FIELD_DESCRIPTIONS","commonPatterns","EMAIL_COMMON_PATTERNS","resourceName","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successBranchSchema","type","literal","item","EmailDetailSchema","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","requestedFields","fullData","headersMap","gmail","response","headers","headersArray","fromInfo","toStr","ccStr","bccStr","messagePayload","bodyContent","payload","filteredPayload","error","message","parseFields","info","Boolean","ProtocolError","ProtocolErrorCode","InvalidParams","gmailApi","version","auth","googleAuth","authContext","users","messages","get","userId","format","metadataHeaders","data","InvalidRequest","Array","isArray","Object","fromEntries","map","h","header","String","name","value","extractFrom","From","extractEmails","To","join","Cc","Bcc","extractBodyFromPayload","undefined","threadId","date","toIsoUtc","Date","from","address","fromName","to","cc","bcc","subject","Subject","snippet","body","bodyContentType","filterFields","content","text","JSON","stringify","structuredContent","Error","InternalError","stack"],"mappings":"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"}
@@ -8,10 +8,11 @@ Object.defineProperty(exports, "default", {
8
8
  return createTool;
9
9
  }
10
10
  });
11
+ var _gmail = require("@googleapis/gmail");
11
12
  var _oauthgoogle = require("@mcp-z/oauth-google");
12
- var _types = require("@modelcontextprotocol/sdk/types.js");
13
- var _googleapis = require("googleapis");
13
+ var _server = require("@mcp-z/server");
14
14
  var _zod = require("zod");
15
+ var _googleauthts = require("../../lib/google-auth.js");
15
16
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
16
17
  try {
17
18
  var info = gen[key](arg);
@@ -174,7 +175,7 @@ function handler(_0, _1) {
174
175
  id: Boolean(id)
175
176
  });
176
177
  if (!id) {
177
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'Missing id');
178
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'Missing id');
178
179
  }
179
180
  _state.label = 1;
180
181
  case 1:
@@ -184,9 +185,9 @@ function handler(_0, _1) {
184
185
  ,
185
186
  4
186
187
  ]);
187
- gmail = _googleapis.google.gmail({
188
+ gmail = (0, _gmail.gmail)({
188
189
  version: 'v1',
189
- auth: extra.authContext.auth
190
+ auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
190
191
  });
191
192
  return [
192
193
  4,
@@ -229,7 +230,7 @@ function handler(_0, _1) {
229
230
  logger.error('gmail-message-mark-read error', {
230
231
  error: message
231
232
  });
232
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error marking message as read: ".concat(message), {
233
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error marking message as read: ".concat(message), {
233
234
  stack: _instanceof(error, Error) ? error.stack : undefined
234
235
  });
235
236
  case 4:
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-mark-read.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to mark as read'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: z.string().describe('Message ID that was marked as read'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Mark a Gmail message as read',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-message-mark-read called', { id: Boolean(id) });\n\n if (!id) {\n throw new McpError(ErrorCode.InvalidParams, 'Missing id');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n await gmail.users.messages.modify({\n userId: 'me',\n id: id,\n requestBody: {\n removeLabelIds: ['UNREAD'],\n },\n });\n\n logger.info('gmail-message-mark-read success', { id });\n\n const result: Output = {\n type: 'success' as const,\n id,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail-message-mark-read error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error marking message as read: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-mark-read',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","successBranchSchema","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","gmail","error","message","info","Boolean","McpError","ErrorCode","InvalidParams","google","version","auth","authContext","users","messages","modify","userId","requestBody","removeLabelIds","content","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","undefined","name"],"mappings":";;;;+BA4EA;;;eAAwBA;;;2BA3EA;qBAKY;0BACb;mBACL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AALlB,IAAM,AAAEC,2BAA6BC,oBAAO,CAApCD;AAOR,IAAME,cAAcC,MAAC,CAACC,MAAM,CAAC;IAC3BC,IAAIF,MAAC,CAACG,MAAM,CAACC,MAAM,GAAGC,IAAI,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;AAC/C;AAEA,IAAMC,sBAAsBR,MAAC,CAACC,MAAM,CAAC;IACnCQ,MAAMT,MAAC,CAACU,OAAO,CAAC;IAChBR,IAAIF,MAAC,CAACI,MAAM,GAAGG,QAAQ,CAAC;AAC1B;AAEA,IAAMI,eAAeX,MAAC,CAACY,kBAAkB,CAAC,QAAQ;IAACJ;IAAqBX;CAAyB;AAEjG,IAAMgB,SAAS;IACbC,aAAa;IACbf,aAAaA;IACbY,cAAcX,MAAC,CAACC,MAAM,CAAC;QACrBc,QAAQJ;IACV;AACF;AAKA,SAAeK;wCAAQ,KAAa,EAAEC,KAAoB;YAAjCf,IACjBgB,QAQEC,OAWAJ,QAcCK,OACDC;;;;oBAnCenB,KAAF,MAAEA;oBACjBgB,SAASD,MAAMC,MAAM;oBAC3BA,OAAOI,IAAI,CAAC,kCAAkC;wBAAEpB,IAAIqB,QAAQrB;oBAAI;oBAEhE,IAAI,CAACA,IAAI;wBACP,MAAM,IAAIsB,eAAQ,CAACC,gBAAS,CAACC,aAAa,EAAE;oBAC9C;;;;;;;;;oBAGQP,QAAQQ,kBAAM,CAACR,KAAK,CAAC;wBAAES,SAAS;wBAAMC,MAAMZ,MAAMa,WAAW,CAACD,IAAI;oBAAC;oBACzE;;wBAAMV,MAAMY,KAAK,CAACC,QAAQ,CAACC,MAAM,CAAC;4BAChCC,QAAQ;4BACRhC,IAAIA;4BACJiC,aAAa;gCACXC,cAAc;oCAAG;;4BACnB;wBACF;;;oBANA;oBAQAlB,OAAOI,IAAI,CAAC,mCAAmC;wBAAEpB,IAAAA;oBAAG;oBAE9Ca,SAAiB;wBACrBN,MAAM;wBACNP,IAAAA;oBACF;oBAEA;;wBAAO;4BACLmC,OAAO;gCACL;oCACE5B,MAAM;oCACN6B,MAAMC,KAAKC,SAAS,CAACzB;gCACvB;;4BAEF0B,mBAAmB;gCAAE1B,QAAAA;4BAAO;wBAC9B;;;oBACOK;oBACDC,UAAUD,AAAK,YAALA,OAAiBsB,SAAQtB,MAAMC,OAAO,GAAGsB,OAAOvB;oBAChEF,OAAOE,KAAK,CAAC,iCAAiC;wBAAEA,OAAOC;oBAAQ;oBAE/D,MAAM,IAAIG,eAAQ,CAACC,gBAAS,CAACmB,aAAa,EAAE,AAAC,kCAAyC,OAARvB,UAAW;wBACvFwB,OAAOzB,AAAK,YAALA,OAAiBsB,SAAQtB,MAAMyB,KAAK,GAAGC;oBAChD;;;;;;;IAEJ;;AAEe,SAASlD;IACtB,OAAO;QACLmD,MAAM;QACNlC,QAAAA;QACAG,SAAAA;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-mark-read.ts"],"sourcesContent":["import { gmail as gmailApi } from '@googleapis/gmail';\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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { z } from 'zod';\nimport { googleAuth } from '../../lib/google-auth.ts';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to mark as read'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: z.string().describe('Message ID that was marked as read'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Mark a Gmail message as read',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-message-mark-read called', { id: Boolean(id) });\n\n if (!id) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id');\n }\n\n try {\n const gmail = gmailApi({ version: 'v1', auth: googleAuth(extra.authContext.auth) });\n await gmail.users.messages.modify({\n userId: 'me',\n id: id,\n requestBody: {\n removeLabelIds: ['UNREAD'],\n },\n });\n\n logger.info('gmail-message-mark-read success', { id });\n\n const result: Output = {\n type: 'success' as const,\n id,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail-message-mark-read error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error marking message as read: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-mark-read',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","successBranchSchema","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","gmail","error","message","info","Boolean","ProtocolError","ProtocolErrorCode","InvalidParams","gmailApi","version","auth","googleAuth","authContext","users","messages","modify","userId","requestBody","removeLabelIds","content","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","undefined","name"],"mappings":";;;;+BA6EA;;;eAAwBA;;;qBA7EU;2BAEV;sBAKyB;mBAC/B;4BACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAL3B,IAAM,AAAEC,2BAA6BC,oBAAO,CAApCD;AAOR,IAAME,cAAcC,MAAC,CAACC,MAAM,CAAC;IAC3BC,IAAIF,MAAC,CAACG,MAAM,CAACC,MAAM,GAAGC,IAAI,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;AAC/C;AAEA,IAAMC,sBAAsBR,MAAC,CAACC,MAAM,CAAC;IACnCQ,MAAMT,MAAC,CAACU,OAAO,CAAC;IAChBR,IAAIF,MAAC,CAACI,MAAM,GAAGG,QAAQ,CAAC;AAC1B;AAEA,IAAMI,eAAeX,MAAC,CAACY,kBAAkB,CAAC,QAAQ;IAACJ;IAAqBX;CAAyB;AAEjG,IAAMgB,SAAS;IACbC,aAAa;IACbf,aAAaA;IACbY,cAAcX,MAAC,CAACC,MAAM,CAAC;QACrBc,QAAQJ;IACV;AACF;AAKA,SAAeK;wCAAQ,KAAa,EAAEC,KAAoB;YAAjCf,IACjBgB,QAQEC,OAWAJ,QAcCK,OACDC;;;;oBAnCenB,KAAF,MAAEA;oBACjBgB,SAASD,MAAMC,MAAM;oBAC3BA,OAAOI,IAAI,CAAC,kCAAkC;wBAAEpB,IAAIqB,QAAQrB;oBAAI;oBAEhE,IAAI,CAACA,IAAI;wBACP,MAAM,IAAIsB,qBAAa,CAACC,yBAAiB,CAACC,aAAa,EAAE;oBAC3D;;;;;;;;;oBAGQP,QAAQQ,IAAAA,YAAQ,EAAC;wBAAEC,SAAS;wBAAMC,MAAMC,IAAAA,wBAAU,EAACb,MAAMc,WAAW,CAACF,IAAI;oBAAE;oBACjF;;wBAAMV,MAAMa,KAAK,CAACC,QAAQ,CAACC,MAAM,CAAC;4BAChCC,QAAQ;4BACRjC,IAAIA;4BACJkC,aAAa;gCACXC,cAAc;oCAAG;;4BACnB;wBACF;;;oBANA;oBAQAnB,OAAOI,IAAI,CAAC,mCAAmC;wBAAEpB,IAAAA;oBAAG;oBAE9Ca,SAAiB;wBACrBN,MAAM;wBACNP,IAAAA;oBACF;oBAEA;;wBAAO;4BACLoC,OAAO;gCACL;oCACE7B,MAAM;oCACN8B,MAAMC,KAAKC,SAAS,CAAC1B;gCACvB;;4BAEF2B,mBAAmB;gCAAE3B,QAAAA;4BAAO;wBAC9B;;;oBACOK;oBACDC,UAAUD,AAAK,YAALA,OAAiBuB,SAAQvB,MAAMC,OAAO,GAAGuB,OAAOxB;oBAChEF,OAAOE,KAAK,CAAC,iCAAiC;wBAAEA,OAAOC;oBAAQ;oBAE/D,MAAM,IAAIG,qBAAa,CAACC,yBAAiB,CAACoB,aAAa,EAAE,AAAC,kCAAyC,OAARxB,UAAW;wBACpGyB,OAAO1B,AAAK,YAALA,OAAiBuB,SAAQvB,MAAM0B,KAAK,GAAGC;oBAChD;;;;;;;IAEJ;;AAEe,SAASnD;IACtB,OAAO;QACLoD,MAAM;QACNnC,QAAAA;QACAG,SAAAA;IACF;AACF"}
@@ -8,11 +8,12 @@ Object.defineProperty(exports, "default", {
8
8
  return createTool;
9
9
  }
10
10
  });
11
+ var _gmail = require("@googleapis/gmail");
11
12
  var _oauthgoogle = require("@mcp-z/oauth-google");
12
- var _types = require("@modelcontextprotocol/sdk/types.js");
13
- var _googleapis = require("googleapis");
13
+ var _server = require("@mcp-z/server");
14
14
  var _zod = require("zod");
15
15
  var _constantsts = require("../../constants.js");
16
+ var _googleauthts = require("../../lib/google-auth.js");
16
17
  function _array_like_to_array(arr, len) {
17
18
  if (len == null || len > arr.length) len = arr.length;
18
19
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
@@ -233,11 +234,11 @@ function handler(_0, _1) {
233
234
  count: ids.length
234
235
  });
235
236
  if (!ids || ids.length === 0) {
236
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'Missing ids');
237
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'Missing ids');
237
238
  }
238
239
  // Validate batch size to prevent memory exhaustion
239
240
  if (ids.length > _constantsts.MAX_BATCH_SIZE) {
240
- throw new _types.McpError(_types.ErrorCode.InvalidParams, "Batch size ".concat(ids.length, " exceeds maximum allowed size of ").concat(_constantsts.MAX_BATCH_SIZE));
241
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, "Batch size ".concat(ids.length, " exceeds maximum allowed size of ").concat(_constantsts.MAX_BATCH_SIZE));
241
242
  }
242
243
  // Validate and sanitize IDs
243
244
  validatedIds = [];
@@ -273,10 +274,10 @@ function handler(_0, _1) {
273
274
  }
274
275
  }
275
276
  if (invalidIds.length > 0) {
276
- throw new _types.McpError(_types.ErrorCode.InvalidParams, "Found ".concat(invalidIds.length, " invalid IDs: ").concat(invalidIds.join(', ')));
277
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, "Found ".concat(invalidIds.length, " invalid IDs: ").concat(invalidIds.join(', ')));
277
278
  }
278
279
  if (validatedIds.length === 0) {
279
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'No valid IDs found after validation');
280
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'No valid IDs found after validation');
280
281
  }
281
282
  _state.label = 1;
282
283
  case 1:
@@ -367,9 +368,9 @@ function handler(_0, _1) {
367
368
  }
368
369
  });
369
370
  };
370
- gmail = _googleapis.google.gmail({
371
+ gmail = (0, _gmail.gmail)({
371
372
  version: 'v1',
372
- auth: extra.authContext.auth
373
+ auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
373
374
  });
374
375
  // Process operations in chunks to prevent memory exhaustion
375
376
  allResults = [];
@@ -433,7 +434,7 @@ function handler(_0, _1) {
433
434
  logger.error('gmail-message-move-to-trash error', {
434
435
  error: message
435
436
  });
436
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error moving messages to trash: ".concat(message), {
437
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error moving messages to trash: ".concat(message), {
437
438
  stack: _instanceof(error, Error) ? error.stack : undefined
438
439
  });
439
440
  case 7:
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-move-to-trash.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Gmail message IDs to move to trash'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n totalRequested: z.number().describe('Total number of messages requested to trash'),\n successCount: z.number().describe('Number of messages successfully moved to trash'),\n failureCount: z.number().describe('Number of messages that failed to move'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Message ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each message'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Move Gmail messages to trash (recoverable).',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ ids }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-message-move-to-trash called', { count: ids.length });\n\n if (!ids || ids.length === 0) {\n throw new McpError(ErrorCode.InvalidParams, 'Missing ids');\n }\n\n // Validate batch size to prevent memory exhaustion\n if (ids.length > MAX_BATCH_SIZE) {\n throw new McpError(ErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);\n }\n\n // Validate and sanitize IDs\n const validatedIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of ids) {\n const trimmedId = id.trim();\n if (!trimmedId) {\n invalidIds.push(id);\n continue;\n }\n // Basic Gmail message ID validation - should not contain certain characters\n if (trimmedId.includes('/') || trimmedId.includes('\\\\') || trimmedId.includes('<') || trimmedId.includes('>')) {\n invalidIds.push(id);\n continue;\n }\n validatedIds.push(trimmedId);\n }\n\n if (invalidIds.length > 0) {\n throw new McpError(ErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);\n }\n\n if (validatedIds.length === 0) {\n throw new McpError(ErrorCode.InvalidParams, 'No valid IDs found after validation');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n // Process operations in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < validatedIds.length; i += CHUNK_SIZE) {\n const chunk = validatedIds.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE) });\n\n const chunkResults = await Promise.allSettled(\n chunk.map(async (id) => {\n await gmail.users.messages.trash({\n userId: 'me',\n id: id,\n });\n return { id, success: true };\n })\n );\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n logger.info('gmail-message-move-to-trash completed', {\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE),\n });\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n results: allResults,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail-message-move-to-trash error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error moving messages to trash: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-move-to-trash',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","ids","array","coerce","string","trim","min","describe","successBranchSchema","type","literal","totalRequested","number","successCount","failureCount","results","id","success","boolean","error","optional","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","validatedIds","invalidIds","trimmedId","gmail","allResults","i","message","info","count","length","McpError","ErrorCode","InvalidParams","MAX_BATCH_SIZE","push","includes","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","Promise","allSettled","map","users","messages","trash","userId","Error","status","errorMessage","reason","String","google","version","auth","authContext","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-move-to-trash.ts"],"sourcesContent":["import { gmail as gmailApi } from '@googleapis/gmail';\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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { z } from 'zod';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\nimport { googleAuth } from '../../lib/google-auth.ts';\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Gmail message IDs to move to trash'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n totalRequested: z.number().describe('Total number of messages requested to trash'),\n successCount: z.number().describe('Number of messages successfully moved to trash'),\n failureCount: z.number().describe('Number of messages that failed to move'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Message ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each message'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Move Gmail messages to trash (recoverable).',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ ids }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-message-move-to-trash called', { count: ids.length });\n\n if (!ids || ids.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing ids');\n }\n\n // Validate batch size to prevent memory exhaustion\n if (ids.length > MAX_BATCH_SIZE) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);\n }\n\n // Validate and sanitize IDs\n const validatedIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of ids) {\n const trimmedId = id.trim();\n if (!trimmedId) {\n invalidIds.push(id);\n continue;\n }\n // Basic Gmail message ID validation - should not contain certain characters\n if (trimmedId.includes('/') || trimmedId.includes('\\\\') || trimmedId.includes('<') || trimmedId.includes('>')) {\n invalidIds.push(id);\n continue;\n }\n validatedIds.push(trimmedId);\n }\n\n if (invalidIds.length > 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);\n }\n\n if (validatedIds.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'No valid IDs found after validation');\n }\n\n try {\n const gmail = gmailApi({ version: 'v1', auth: googleAuth(extra.authContext.auth) });\n // Process operations in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < validatedIds.length; i += CHUNK_SIZE) {\n const chunk = validatedIds.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE) });\n\n const chunkResults = await Promise.allSettled(\n chunk.map(async (id) => {\n await gmail.users.messages.trash({\n userId: 'me',\n id: id,\n });\n return { id, success: true };\n })\n );\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n logger.info('gmail-message-move-to-trash completed', {\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE),\n });\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n results: allResults,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail-message-move-to-trash error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error moving messages to trash: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-move-to-trash',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","ids","array","coerce","string","trim","min","describe","successBranchSchema","type","literal","totalRequested","number","successCount","failureCount","results","id","success","boolean","error","optional","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","validatedIds","invalidIds","trimmedId","gmail","allResults","i","message","info","count","length","ProtocolError","ProtocolErrorCode","InvalidParams","MAX_BATCH_SIZE","push","includes","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","Promise","allSettled","map","users","messages","trash","userId","Error","status","errorMessage","reason","String","gmailApi","version","auth","googleAuth","authContext","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
@@ -8,13 +8,14 @@ Object.defineProperty(exports, "default", {
8
8
  return createTool;
9
9
  }
10
10
  });
11
+ var _gmail = require("@googleapis/gmail");
11
12
  var _email = require("@mcp-z/email");
12
13
  var _oauthgoogle = require("@mcp-z/oauth-google");
13
- var _types = require("@modelcontextprotocol/sdk/types.js");
14
- var _googleapis = require("googleapis");
14
+ var _server = require("@mcp-z/server");
15
15
  var _zod = require("zod");
16
16
  var _headersutilsts = require("../../email/parsing/headers-utils.js");
17
17
  var _base64encodingts = require("../../lib/base64-encoding.js");
18
+ var _googleauthts = require("../../lib/google-auth.js");
18
19
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
19
20
  try {
20
21
  var info = gen[key](arg);
@@ -202,7 +203,7 @@ function handler(_0, _1) {
202
203
  id = param.id, body = param.body, contentType = param.contentType;
203
204
  logger = extra.logger;
204
205
  if (!id || !body) {
205
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'Missing id or body');
206
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'Missing id or body');
206
207
  }
207
208
  logger.info('gmail.message.respond called', {
208
209
  id: id,
@@ -216,9 +217,9 @@ function handler(_0, _1) {
216
217
  ,
217
218
  8
218
219
  ]);
219
- gmail = _googleapis.google.gmail({
220
+ gmail = (0, _gmail.gmail)({
220
221
  version: 'v1',
221
- auth: extra.authContext.auth
222
+ auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
222
223
  });
223
224
  _state.label = 2;
224
225
  case 2:
@@ -259,7 +260,7 @@ function handler(_0, _1) {
259
260
  logger.error('gmail.message.respond fetch error', {
260
261
  error: message
261
262
  });
262
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error fetching message metadata: ".concat(message), {
263
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error fetching message metadata: ".concat(message), {
263
264
  stack: _instanceof(error, Error) ? error.stack : undefined
264
265
  });
265
266
  case 5:
@@ -340,7 +341,7 @@ function handler(_0, _1) {
340
341
  logger.error('gmail.message.respond error', {
341
342
  error: message1
342
343
  });
343
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error responding to message: ".concat(message1), {
344
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error responding to message: ".concat(message1), {
344
345
  stack: _instanceof(error1, Error) ? error1.stack : undefined
345
346
  });
346
347
  case 8:
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-respond.ts"],"sourcesContent":["import { ComposeContentTypeSchema } 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 { extractEmails } from '../../email/parsing/headers-utils.ts';\nimport { b64url } from '../../lib/base64-encoding.ts';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to reply to'),\n body: z.coerce.string().trim().min(1).describe('Reply body content (plain text or HTML)'),\n contentType: ComposeContentTypeSchema,\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: z.string().describe('Original message ID that was replied to'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Send a reply to a Gmail message',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, body, contentType }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n\n if (!id || !body) {\n throw new McpError(ErrorCode.InvalidParams, 'Missing id or body');\n }\n\n logger.info('gmail.message.respond called', { id, contentType });\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n\n let full: unknown;\n try {\n const response = await gmail.users.messages.get({\n userId: 'me',\n id: id,\n format: 'metadata',\n metadataHeaders: ['From', 'To', 'Reply-To', 'Subject', 'Message-ID', 'References', 'In-Reply-To', 'Date'],\n });\n full = response.data;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.message.respond fetch error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error fetching message metadata: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n\n // Type-safe header extraction\n const fullData = full as { payload?: { headers?: unknown[] }; threadId?: unknown };\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 const fromHdr = headers.From || headers.from;\n const replyToHdr = headers['Reply-To'] || headers['reply-to'];\n const toAddr = (replyToHdr ? extractEmails(replyToHdr)[0] : extractEmails(fromHdr)[0]) ?? '';\n const subject = (headers.Subject || headers.subject) ?? '';\n const messageIdHeader = headers['Message-ID'] || headers['Message-Id'] || headers['message-id'];\n const references = (headers.References || headers.references) ?? '';\n const replySubject = /^re:/i.test(subject) ? subject : `Re: ${subject}`;\n const inReplyTo = messageIdHeader?.startsWith('<') ? messageIdHeader : messageIdHeader ? `<${messageIdHeader}>` : undefined;\n const refs = [references, inReplyTo].filter(Boolean).join(' ').trim();\n const mimeType = contentType === 'html' ? 'text/html' : 'text/plain';\n const lines = [`To: ${toAddr}`, `Subject: ${replySubject}`, `In-Reply-To: ${inReplyTo ?? ''}`, `References: ${refs}`, 'MIME-Version: 1.0', `Content-Type: ${mimeType}; charset=UTF-8`, '', body].join('\\r\\n');\n const raw = b64url(lines);\n\n // Prepare request body with conditional threadId for exactOptionalPropertyTypes\n const threadId = fullData?.threadId ? String(fullData.threadId) : undefined;\n await gmail.users.messages.send({\n userId: 'me',\n requestBody: {\n raw: raw,\n ...(threadId && { threadId }),\n },\n });\n\n logger.info('gmail.message.respond sent reply', { id });\n\n const result: Output = {\n type: 'success' as const,\n id,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.message.respond error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error responding to message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-respond',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","body","contentType","ComposeContentTypeSchema","successBranchSchema","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","replyToHdr","headers","fullData","gmail","full","response","error","message","headersArray","fromHdr","toAddr","subject","messageIdHeader","references","replySubject","inReplyTo","refs","mimeType","lines","raw","threadId","McpError","ErrorCode","InvalidParams","info","google","version","auth","authContext","users","messages","get","userId","format","metadataHeaders","data","Error","String","InternalError","stack","undefined","Array","isArray","payload","Object","fromEntries","map","h","header","name","value","From","from","extractEmails","Subject","References","test","startsWith","filter","Boolean","join","b64url","send","requestBody","content","text","JSON","stringify","structuredContent"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-respond.ts"],"sourcesContent":["import { gmail as gmailApi } from '@googleapis/gmail';\nimport { ComposeContentTypeSchema } 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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { z } from 'zod';\nimport { extractEmails } from '../../email/parsing/headers-utils.ts';\nimport { b64url } from '../../lib/base64-encoding.ts';\nimport { googleAuth } from '../../lib/google-auth.ts';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to reply to'),\n body: z.coerce.string().trim().min(1).describe('Reply body content (plain text or HTML)'),\n contentType: ComposeContentTypeSchema,\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: z.string().describe('Original message ID that was replied to'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Send a reply to a Gmail message',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, body, contentType }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n\n if (!id || !body) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id or body');\n }\n\n logger.info('gmail.message.respond called', { id, contentType });\n\n try {\n const gmail = gmailApi({ version: 'v1', auth: googleAuth(extra.authContext.auth) });\n\n let full: unknown;\n try {\n const response = await gmail.users.messages.get({\n userId: 'me',\n id: id,\n format: 'metadata',\n metadataHeaders: ['From', 'To', 'Reply-To', 'Subject', 'Message-ID', 'References', 'In-Reply-To', 'Date'],\n });\n full = response.data;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.message.respond fetch error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error fetching message metadata: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n\n // Type-safe header extraction\n const fullData = full as { payload?: { headers?: unknown[] }; threadId?: unknown };\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 const fromHdr = headers.From || headers.from;\n const replyToHdr = headers['Reply-To'] || headers['reply-to'];\n const toAddr = (replyToHdr ? extractEmails(replyToHdr)[0] : extractEmails(fromHdr)[0]) ?? '';\n const subject = (headers.Subject || headers.subject) ?? '';\n const messageIdHeader = headers['Message-ID'] || headers['Message-Id'] || headers['message-id'];\n const references = (headers.References || headers.references) ?? '';\n const replySubject = /^re:/i.test(subject) ? subject : `Re: ${subject}`;\n const inReplyTo = messageIdHeader?.startsWith('<') ? messageIdHeader : messageIdHeader ? `<${messageIdHeader}>` : undefined;\n const refs = [references, inReplyTo].filter(Boolean).join(' ').trim();\n const mimeType = contentType === 'html' ? 'text/html' : 'text/plain';\n const lines = [`To: ${toAddr}`, `Subject: ${replySubject}`, `In-Reply-To: ${inReplyTo ?? ''}`, `References: ${refs}`, 'MIME-Version: 1.0', `Content-Type: ${mimeType}; charset=UTF-8`, '', body].join('\\r\\n');\n const raw = b64url(lines);\n\n // Prepare request body with conditional threadId for exactOptionalPropertyTypes\n const threadId = fullData?.threadId ? String(fullData.threadId) : undefined;\n await gmail.users.messages.send({\n userId: 'me',\n requestBody: {\n raw: raw,\n ...(threadId && { threadId }),\n },\n });\n\n logger.info('gmail.message.respond sent reply', { id });\n\n const result: Output = {\n type: 'success' as const,\n id,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail.message.respond error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error responding to message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-respond',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","body","contentType","ComposeContentTypeSchema","successBranchSchema","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","replyToHdr","headers","fullData","gmail","full","response","error","message","headersArray","fromHdr","toAddr","subject","messageIdHeader","references","replySubject","inReplyTo","refs","mimeType","lines","raw","threadId","ProtocolError","ProtocolErrorCode","InvalidParams","info","gmailApi","version","auth","googleAuth","authContext","users","messages","get","userId","format","metadataHeaders","data","Error","String","InternalError","stack","undefined","Array","isArray","payload","Object","fromEntries","map","h","header","name","value","From","from","extractEmails","Subject","References","test","startsWith","filter","Boolean","join","b64url","send","requestBody","content","text","JSON","stringify","structuredContent"],"mappings":"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"}
@@ -8,15 +8,15 @@ Object.defineProperty(exports, "default", {
8
8
  return createTool;
9
9
  }
10
10
  });
11
- var _types = require("@modelcontextprotocol/sdk/types.js");
11
+ var _gmail = require("@googleapis/gmail");
12
+ var _server = require("@mcp-z/server");
12
13
  var _email = require("@mcp-z/email");
13
14
  var _oauthgoogle = require("@mcp-z/oauth-google");
14
- var _server = require("@mcp-z/server");
15
- var _googleapis = require("googleapis");
16
15
  var _zod = require("zod");
17
16
  var _constantsts = require("../../constants.js");
18
17
  var _htmlprocessingts = require("../../email/parsing/html-processing.js");
19
18
  var _executequeryts = require("../../email/querying/execute-query.js");
19
+ var _googleauthts = require("../../lib/google-auth.js");
20
20
  var _gmailqueryschemats = require("../../schemas/gmail-query-schema.js");
21
21
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
22
22
  try {
@@ -271,9 +271,9 @@ function handler(_0, _1) {
271
271
  includeBody: includeBody,
272
272
  accountId: extra.authContext.accountId
273
273
  });
274
- gmail = _googleapis.google.gmail({
274
+ gmail = (0, _gmail.gmail)({
275
275
  version: 'v1',
276
- auth: extra.authContext.auth
276
+ auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
277
277
  });
278
278
  started = Date.now();
279
279
  return [
@@ -378,7 +378,7 @@ function handler(_0, _1) {
378
378
  logger.error('gmail.message.search error', {
379
379
  error: message
380
380
  });
381
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error searching messages: ".concat(message), {
381
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error searching messages: ".concat(message), {
382
382
  stack: _instanceof(error, Error) ? error.stack : undefined
383
383
  });
384
384
  case 4:
@@ -1 +1 @@
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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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-search.ts"],"sourcesContent":["import { type gmail_v1, gmail as gmailApi } from '@googleapis/gmail';\nimport { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\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 { 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 { googleAuth } from '../../lib/google-auth.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 = gmailApi({ version: 'v1', auth: googleAuth(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 ProtocolError(ProtocolErrorCode.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","gmailApi","version","auth","googleAuth","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","ProtocolError","ProtocolErrorCode","InternalError","stack"],"mappings":"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"}
@@ -8,13 +8,14 @@ Object.defineProperty(exports, "default", {
8
8
  return createTool;
9
9
  }
10
10
  });
11
+ var _gmail = require("@googleapis/gmail");
11
12
  var _email = require("@mcp-z/email");
12
13
  var _oauthgoogle = require("@mcp-z/oauth-google");
13
- var _types = require("@modelcontextprotocol/sdk/types.js");
14
- var _googleapis = require("googleapis");
14
+ var _server = require("@mcp-z/server");
15
15
  var _zod = require("zod");
16
16
  var _rfc822builderts = require("../../email/composition/rfc822-builder.js");
17
17
  var _base64encodingts = require("../../lib/base64-encoding.js");
18
+ var _googleauthts = require("../../lib/google-auth.js");
18
19
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
19
20
  try {
20
21
  var info = gen[key](arg);
@@ -186,7 +187,7 @@ function handler(params, extra) {
186
187
  contentType: contentType
187
188
  });
188
189
  if (!to) {
189
- throw new _types.McpError(_types.ErrorCode.InvalidParams, 'Missing required field: to');
190
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InvalidParams, 'Missing required field: to');
190
191
  }
191
192
  _state.label = 1;
192
193
  case 1:
@@ -208,9 +209,9 @@ function handler(params, extra) {
208
209
  if (subject !== undefined) msgArgs.subject = subject;
209
210
  raw = (0, _rfc822builderts.buildRfc822FromArgs)(msgArgs);
210
211
  encodedMessage = (0, _base64encodingts.b64url)(raw);
211
- gmail = _googleapis.google.gmail({
212
+ gmail = (0, _gmail.gmail)({
212
213
  version: 'v1',
213
- auth: extra.authContext.auth
214
+ auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
214
215
  });
215
216
  return [
216
217
  4,
@@ -263,7 +264,7 @@ function handler(params, extra) {
263
264
  logger.error('gmail.message.send error', {
264
265
  error: message
265
266
  });
266
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error sending message: ".concat(message), {
267
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error sending message: ".concat(message), {
267
268
  stack: _instanceof(error, Error) ? error.stack : undefined
268
269
  });
269
270
  case 4:
@@ -1 +1 @@
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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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-send.ts"],"sourcesContent":["import { gmail as gmailApi } from '@googleapis/gmail';\nimport { 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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { z } from 'zod';\nimport { buildRfc822FromArgs } from '../../email/composition/rfc822-builder.ts';\nimport { b64url } from '../../lib/base64-encoding.ts';\nimport { googleAuth } from '../../lib/google-auth.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 ProtocolError(ProtocolErrorCode.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 = gmailApi({ version: 'v1', auth: googleAuth(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 ProtocolError(ProtocolErrorCode.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","ProtocolError","ProtocolErrorCode","InvalidParams","undefined","buildRfc822FromArgs","b64url","gmailApi","version","auth","googleAuth","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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"}