@mcp-z/mcp-gmail 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +33 -3
  2. package/bin/server.js +1 -1
  3. package/dist/cjs/constants.js.map +1 -1
  4. package/dist/cjs/email/composition/rfc822-builder.js.map +1 -1
  5. package/dist/cjs/email/messages/fetch-message.js +7 -7
  6. package/dist/cjs/email/messages/fetch-message.js.map +1 -1
  7. package/dist/cjs/email/messages/messages.js +10 -10
  8. package/dist/cjs/email/messages/messages.js.map +1 -1
  9. package/dist/cjs/email/parsing/header-parsing.js +3 -3
  10. package/dist/cjs/email/parsing/header-parsing.js.map +1 -1
  11. package/dist/cjs/email/parsing/headers-utils.js.map +1 -1
  12. package/dist/cjs/email/parsing/html-processing.js.map +1 -1
  13. package/dist/cjs/email/parsing/message-extraction.js +5 -5
  14. package/dist/cjs/email/parsing/message-extraction.js.map +1 -1
  15. package/dist/cjs/email/querying/execute-query.js +2 -2
  16. package/dist/cjs/email/querying/execute-query.js.map +1 -1
  17. package/dist/cjs/email/querying/pagination.js.map +1 -1
  18. package/dist/cjs/email/querying/query-builder.js.map +1 -1
  19. package/dist/cjs/email/querying/search-execution.js +4 -4
  20. package/dist/cjs/email/querying/search-execution.js.map +1 -1
  21. package/dist/cjs/index.d.cts +4 -0
  22. package/dist/cjs/index.d.ts +4 -0
  23. package/dist/cjs/index.js +21 -13
  24. package/dist/cjs/index.js.map +1 -1
  25. package/dist/cjs/labels/gmail-labels.js.map +1 -1
  26. package/dist/cjs/lib/base64-encoding.js.map +1 -1
  27. package/dist/cjs/lib/create-store.js.map +1 -1
  28. package/dist/cjs/lib/date-conversion.js.map +1 -1
  29. package/dist/cjs/lib/messages-to-row.js.map +1 -1
  30. package/dist/cjs/mcp/index.js +6 -6
  31. package/dist/cjs/mcp/index.js.map +1 -1
  32. package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
  33. package/dist/cjs/mcp/prompts/index.js +4 -4
  34. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  35. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
  36. package/dist/cjs/mcp/resources/email.js +5 -5
  37. package/dist/cjs/mcp/resources/email.js.map +1 -1
  38. package/dist/cjs/mcp/resources/index.js +2 -2
  39. package/dist/cjs/mcp/resources/index.js.map +1 -1
  40. package/dist/cjs/mcp/tools/categories-list.d.cts +8 -2
  41. package/dist/cjs/mcp/tools/categories-list.d.ts +8 -2
  42. package/dist/cjs/mcp/tools/categories-list.js +12 -4
  43. package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
  44. package/dist/cjs/mcp/tools/index.js +22 -22
  45. package/dist/cjs/mcp/tools/index.js.map +1 -1
  46. package/dist/cjs/mcp/tools/label-add.js +2 -2
  47. package/dist/cjs/mcp/tools/label-add.js.map +1 -1
  48. package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
  49. package/dist/cjs/mcp/tools/labels-list.d.cts +8 -2
  50. package/dist/cjs/mcp/tools/labels-list.d.ts +8 -2
  51. package/dist/cjs/mcp/tools/labels-list.js +12 -4
  52. package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
  53. package/dist/cjs/mcp/tools/message-get.js +8 -8
  54. package/dist/cjs/mcp/tools/message-get.js.map +1 -1
  55. package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
  56. package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
  57. package/dist/cjs/mcp/tools/message-respond.js +4 -4
  58. package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
  59. package/dist/cjs/mcp/tools/message-search.js +6 -6
  60. package/dist/cjs/mcp/tools/message-search.js.map +1 -1
  61. package/dist/cjs/mcp/tools/message-send.js +4 -4
  62. package/dist/cjs/mcp/tools/message-send.js.map +1 -1
  63. package/dist/cjs/mcp/tools/messages-export-csv.js +6 -6
  64. package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
  65. package/dist/cjs/schemas/gmail-query-schema.js.map +1 -1
  66. package/dist/cjs/schemas/index.js.map +1 -1
  67. package/dist/cjs/setup/config.js +11 -1
  68. package/dist/cjs/setup/config.js.map +1 -1
  69. package/dist/cjs/setup/http.js +6 -2
  70. package/dist/cjs/setup/http.js.map +1 -1
  71. package/dist/cjs/setup/index.d.cts +1 -0
  72. package/dist/cjs/setup/index.d.ts +1 -0
  73. package/dist/cjs/setup/index.js +9 -9
  74. package/dist/cjs/setup/index.js.map +1 -1
  75. package/dist/cjs/setup/oauth-google.d.cts +3 -2
  76. package/dist/cjs/setup/oauth-google.d.ts +3 -2
  77. package/dist/cjs/setup/oauth-google.js +15 -12
  78. package/dist/cjs/setup/oauth-google.js.map +1 -1
  79. package/dist/cjs/setup/runtime.js +9 -9
  80. package/dist/cjs/setup/runtime.js.map +1 -1
  81. package/dist/cjs/setup/stdio.js +2 -2
  82. package/dist/cjs/setup/stdio.js.map +1 -1
  83. package/dist/esm/constants.js.map +1 -1
  84. package/dist/esm/email/composition/rfc822-builder.js.map +1 -1
  85. package/dist/esm/email/messages/fetch-message.js.map +1 -1
  86. package/dist/esm/email/messages/messages.js.map +1 -1
  87. package/dist/esm/email/parsing/header-parsing.js.map +1 -1
  88. package/dist/esm/email/parsing/headers-utils.js.map +1 -1
  89. package/dist/esm/email/parsing/html-processing.js.map +1 -1
  90. package/dist/esm/email/parsing/message-extraction.js.map +1 -1
  91. package/dist/esm/email/querying/execute-query.js.map +1 -1
  92. package/dist/esm/email/querying/pagination.js.map +1 -1
  93. package/dist/esm/email/querying/query-builder.js.map +1 -1
  94. package/dist/esm/email/querying/search-execution.js.map +1 -1
  95. package/dist/esm/index.d.ts +4 -0
  96. package/dist/esm/index.js +2 -0
  97. package/dist/esm/index.js.map +1 -1
  98. package/dist/esm/labels/gmail-labels.js.map +1 -1
  99. package/dist/esm/lib/base64-encoding.js.map +1 -1
  100. package/dist/esm/lib/create-store.js.map +1 -1
  101. package/dist/esm/lib/date-conversion.js.map +1 -1
  102. package/dist/esm/lib/messages-to-row.js.map +1 -1
  103. package/dist/esm/mcp/index.js.map +1 -1
  104. package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
  105. package/dist/esm/mcp/prompts/index.js.map +1 -1
  106. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
  107. package/dist/esm/mcp/resources/email.js.map +1 -1
  108. package/dist/esm/mcp/resources/index.js.map +1 -1
  109. package/dist/esm/mcp/tools/categories-list.d.ts +8 -2
  110. package/dist/esm/mcp/tools/categories-list.js +4 -2
  111. package/dist/esm/mcp/tools/categories-list.js.map +1 -1
  112. package/dist/esm/mcp/tools/index.js.map +1 -1
  113. package/dist/esm/mcp/tools/label-add.js.map +1 -1
  114. package/dist/esm/mcp/tools/label-delete.js.map +1 -1
  115. package/dist/esm/mcp/tools/labels-list.d.ts +8 -2
  116. package/dist/esm/mcp/tools/labels-list.js +4 -2
  117. package/dist/esm/mcp/tools/labels-list.js.map +1 -1
  118. package/dist/esm/mcp/tools/message-get.js.map +1 -1
  119. package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
  120. package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
  121. package/dist/esm/mcp/tools/message-respond.js.map +1 -1
  122. package/dist/esm/mcp/tools/message-search.js.map +1 -1
  123. package/dist/esm/mcp/tools/message-send.js.map +1 -1
  124. package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
  125. package/dist/esm/schemas/gmail-query-schema.js.map +1 -1
  126. package/dist/esm/schemas/index.js.map +1 -1
  127. package/dist/esm/setup/config.js +12 -2
  128. package/dist/esm/setup/config.js.map +1 -1
  129. package/dist/esm/setup/http.js +4 -0
  130. package/dist/esm/setup/http.js.map +1 -1
  131. package/dist/esm/setup/index.d.ts +1 -0
  132. package/dist/esm/setup/index.js.map +1 -1
  133. package/dist/esm/setup/oauth-google.d.ts +3 -2
  134. package/dist/esm/setup/oauth-google.js +8 -11
  135. package/dist/esm/setup/oauth-google.js.map +1 -1
  136. package/dist/esm/setup/runtime.js.map +1 -1
  137. package/dist/esm/setup/stdio.js.map +1 -1
  138. package/dist/esm/types.js.map +1 -1
  139. package/package.json +2 -2
package/README.md CHANGED
@@ -50,6 +50,12 @@ MCP supports stdio and HTTP.
50
50
  3. Enable the Gmail API.
51
51
  4. Create OAuth 2.0 credentials (Desktop app).
52
52
  5. Copy the Client ID and Client Secret.
53
+ 6. Select your MCP transport (stdio for local and http for remote) and platform
54
+ - For stdio, choose "APIs & Services", + Create client, "Desktop app" type
55
+ - For http, choose "APIs & Services", + Create client, "Web application" type, add your URL (default is http://localhost:3000/oauth/callback based on the --port or PORT)
56
+ - For local hosting, add "http://127.0.0.1" for [Ephemeral redirect URL](https://en.wikipedia.org/wiki/Ephemeral_port)
57
+ 7. Enable OAuth2 [scopes](https://console.cloud.google.com/auth/scopes): openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/
58
+ 8. Add [test emails](https://console.cloud.google.com/auth/audience)
53
59
 
54
60
  ## OAuth modes
55
61
 
@@ -64,7 +70,7 @@ GOOGLE_CLIENT_ID=your-client-id
64
70
  GOOGLE_CLIENT_SECRET=your-client-secret
65
71
  ```
66
72
 
67
- Example:
73
+ Example (stdio) - Create .mcp.json:
68
74
  ```json
69
75
  {
70
76
  "mcpServers": {
@@ -72,14 +78,38 @@ Example:
72
78
  "command": "npx",
73
79
  "args": ["-y", "@mcp-z/mcp-gmail"],
74
80
  "env": {
75
- "GOOGLE_CLIENT_ID": "your-client-id",
76
- "GOOGLE_CLIENT_SECRET": "your-client-secret"
81
+ "GOOGLE_CLIENT_ID": "your-client-id"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ Example (http) - Create .mcp.json:
89
+ ```json
90
+ {
91
+ "mcpServers": {
92
+ "outlook": {
93
+ "type": "http",
94
+ "url": "http://localhost:3000",
95
+ "start": {
96
+ "command": "npx",
97
+ "args": ["-y", "@mcp-z/mcp-gmail", "--port=3000"],
98
+ "env": {
99
+ "GOOGLE_CLIENT_ID": "your-client-id"
100
+ }
77
101
  }
78
102
  }
79
103
  }
80
104
  }
81
105
  ```
82
106
 
107
+ Local (default): omit REDIRECT_URI → ephemeral loopback.
108
+ Cloud: set REDIRECT_URI to your public /oauth/callback and expose the service publicly.
109
+
110
+ Note: start block is a helper in "npx @mcp-z/cli up" for starting an http server from your .mpc.json. See [@mcp-z/cli](https://github.com/mcp-z/cli) for details.
111
+
112
+
83
113
  ### Service account
84
114
 
85
115
  Environment variables:
package/bin/server.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // biome-ignore lint/security/noGlobalEval: dual esm and cjs
4
- if (typeof require === 'undefined') eval("import('../dist/esm/index.js').then((cli) => cli.default(process.argv.slice(2), 'mcp-gmail')).catch((err) => { console.log(err); process.exit(-1); });");
4
+ if (typeof require === 'undefined') eval("import('../dist/esm/index.js').then((cli) => cli.default(process.argv.slice(2), 'mcp-gmail')).catch((err) => { console.error(err); process.exit(-1); });");
5
5
  else require('../dist/cjs/index.js')(process.argv.slice(2), 'mcp-gmail');
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/constants.ts"],"sourcesContent":["/**\n * Gmail MCP Server Constants\n *\n * These scopes are required for Gmail functionality and are hardcoded\n * rather than externally configured since this server knows its own requirements.\n */\n\nimport { EMAIL_CHUNK_SIZE, EMAIL_MAX_BATCH_SIZE } from '@mcp-z/email';\n\n// Google OAuth scopes required for Gmail operations\nexport const GOOGLE_SCOPE = 'openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/';\n\n// Batch processing configuration (from shared email constants)\nexport const CHUNK_SIZE = EMAIL_CHUNK_SIZE;\nexport const MAX_BATCH_SIZE = EMAIL_MAX_BATCH_SIZE;\n\n// Pagination configuration\nexport const DEFAULT_PAGE_SIZE = 50; // Default number of items per page\nexport const MAX_PAGE_SIZE = 1000; // Maximum number of items per page\n"],"names":["CHUNK_SIZE","DEFAULT_PAGE_SIZE","GOOGLE_SCOPE","MAX_BATCH_SIZE","MAX_PAGE_SIZE","EMAIL_CHUNK_SIZE","EMAIL_MAX_BATCH_SIZE"],"mappings":"AAAA;;;;;CAKC;;;;;;;;;;;QAQYA;eAAAA;;QAIAC;eAAAA;;QAPAC;eAAAA;;QAIAC;eAAAA;;QAIAC;eAAAA;;;qBAX0C;AAGhD,IAAMF,eAAe;AAGrB,IAAMF,aAAaK,uBAAgB;AACnC,IAAMF,iBAAiBG,2BAAoB;AAG3C,IAAML,oBAAoB,IAAI,mCAAmC;AACjE,IAAMG,gBAAgB,MAAM,mCAAmC"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/constants.ts"],"sourcesContent":["/**\n * Gmail MCP Server Constants\n *\n * These scopes are required for Gmail functionality and are hardcoded\n * rather than externally configured since this server knows its own requirements.\n */\n\nimport { EMAIL_CHUNK_SIZE, EMAIL_MAX_BATCH_SIZE } from '@mcp-z/email';\n\n// Google OAuth scopes required for Gmail operations\nexport const GOOGLE_SCOPE = 'openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/';\n\n// Batch processing configuration (from shared email constants)\nexport const CHUNK_SIZE = EMAIL_CHUNK_SIZE;\nexport const MAX_BATCH_SIZE = EMAIL_MAX_BATCH_SIZE;\n\n// Pagination configuration\nexport const DEFAULT_PAGE_SIZE = 50; // Default number of items per page\nexport const MAX_PAGE_SIZE = 1000; // Maximum number of items per page\n"],"names":["CHUNK_SIZE","DEFAULT_PAGE_SIZE","GOOGLE_SCOPE","MAX_BATCH_SIZE","MAX_PAGE_SIZE","EMAIL_CHUNK_SIZE","EMAIL_MAX_BATCH_SIZE"],"mappings":"AAAA;;;;;CAKC;;;;;;;;;;;QAQYA;eAAAA;;QAIAC;eAAAA;;QAPAC;eAAAA;;QAIAC;eAAAA;;QAIAC;eAAAA;;;qBAX0C;AAGhD,IAAMF,eAAe;AAGrB,IAAMF,aAAaK,uBAAgB;AACnC,IAAMF,iBAAiBG,2BAAoB;AAG3C,IAAML,oBAAoB,IAAI,mCAAmC;AACjE,IAAMG,gBAAgB,MAAM,mCAAmC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/composition/rfc822-builder.ts"],"sourcesContent":["export interface Rfc822Args {\n to?: string | string[];\n cc?: string | string[];\n bcc?: string | string[];\n subject?: string;\n body?: string;\n from?: string;\n /** Content type for the email body */\n contentType?: 'text' | 'html';\n}\n\nexport function buildRfc822FromArgs(args: Rfc822Args): string {\n const { to = [], cc = [], bcc = [], subject = '', body = '', from = '', contentType = 'text' } = args;\n\n const headers: string[] = [];\n\n if (from) headers.push(`From: ${from}`);\n if (to && to.length) headers.push(`To: ${Array.isArray(to) ? to.join(', ') : to}`);\n if (cc && cc.length) headers.push(`Cc: ${Array.isArray(cc) ? cc.join(', ') : cc}`);\n if (bcc && bcc.length) headers.push(`Bcc: ${Array.isArray(bcc) ? bcc.join(', ') : bcc}`);\n if (subject) headers.push(`Subject: ${subject}`);\n\n headers.push('MIME-Version: 1.0');\n const mimeType = contentType === 'html' ? 'text/html' : 'text/plain';\n headers.push(`Content-Type: ${mimeType}; charset=utf-8`);\n\n return `${headers.join('\\r\\n')}\\r\\n\\r\\n${body}`;\n}\n"],"names":["buildRfc822FromArgs","args","to","cc","bcc","subject","body","from","contentType","headers","push","length","Array","isArray","join","mimeType"],"mappings":";;;;+BAWgBA;;;eAAAA;;;AAAT,SAASA,oBAAoBC,IAAgB;IAClD,eAAiGA,KAAzFC,IAAAA,2BAAK,EAAE,wBAAkFD,KAAhFE,IAAAA,2BAAK,EAAE,yBAAyEF,KAAvEG,KAAAA,6BAAM,EAAE,8BAA+DH,KAA7DI,SAAAA,qCAAU,iCAAmDJ,KAA/CK,MAAAA,+BAAO,8BAAwCL,KAApCM,MAAAA,+BAAO,qCAA6BN,KAAzBO,aAAAA,6CAAc;IAEtF,IAAMC,UAAoB,EAAE;IAE5B,IAAIF,MAAME,QAAQC,IAAI,CAAC,AAAC,SAAa,OAALH;IAChC,IAAIL,MAAMA,GAAGS,MAAM,EAAEF,QAAQC,IAAI,CAAC,AAAC,OAA6C,OAAvCE,MAAMC,OAAO,CAACX,MAAMA,GAAGY,IAAI,CAAC,QAAQZ;IAC7E,IAAIC,MAAMA,GAAGQ,MAAM,EAAEF,QAAQC,IAAI,CAAC,AAAC,OAA6C,OAAvCE,MAAMC,OAAO,CAACV,MAAMA,GAAGW,IAAI,CAAC,QAAQX;IAC7E,IAAIC,OAAOA,IAAIO,MAAM,EAAEF,QAAQC,IAAI,CAAC,AAAC,QAAiD,OAA1CE,MAAMC,OAAO,CAACT,OAAOA,IAAIU,IAAI,CAAC,QAAQV;IAClF,IAAIC,SAASI,QAAQC,IAAI,CAAC,AAAC,YAAmB,OAARL;IAEtCI,QAAQC,IAAI,CAAC;IACb,IAAMK,WAAWP,gBAAgB,SAAS,cAAc;IACxDC,QAAQC,IAAI,CAAC,AAAC,iBAAyB,OAATK,UAAS;IAEvC,OAAO,AAAC,GAAiCT,OAA/BG,QAAQK,IAAI,CAAC,SAAQ,YAAe,OAALR;AAC3C"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/composition/rfc822-builder.ts"],"sourcesContent":["export interface Rfc822Args {\n to?: string | string[];\n cc?: string | string[];\n bcc?: string | string[];\n subject?: string;\n body?: string;\n from?: string;\n /** Content type for the email body */\n contentType?: 'text' | 'html';\n}\n\nexport function buildRfc822FromArgs(args: Rfc822Args): string {\n const { to = [], cc = [], bcc = [], subject = '', body = '', from = '', contentType = 'text' } = args;\n\n const headers: string[] = [];\n\n if (from) headers.push(`From: ${from}`);\n if (to && to.length) headers.push(`To: ${Array.isArray(to) ? to.join(', ') : to}`);\n if (cc && cc.length) headers.push(`Cc: ${Array.isArray(cc) ? cc.join(', ') : cc}`);\n if (bcc && bcc.length) headers.push(`Bcc: ${Array.isArray(bcc) ? bcc.join(', ') : bcc}`);\n if (subject) headers.push(`Subject: ${subject}`);\n\n headers.push('MIME-Version: 1.0');\n const mimeType = contentType === 'html' ? 'text/html' : 'text/plain';\n headers.push(`Content-Type: ${mimeType}; charset=utf-8`);\n\n return `${headers.join('\\r\\n')}\\r\\n\\r\\n${body}`;\n}\n"],"names":["buildRfc822FromArgs","args","to","cc","bcc","subject","body","from","contentType","headers","push","length","Array","isArray","join","mimeType"],"mappings":";;;;+BAWgBA;;;eAAAA;;;AAAT,SAASA,oBAAoBC,IAAgB;IAClD,eAAiGA,KAAzFC,IAAAA,2BAAK,EAAE,wBAAkFD,KAAhFE,IAAAA,2BAAK,EAAE,yBAAyEF,KAAvEG,KAAAA,6BAAM,EAAE,8BAA+DH,KAA7DI,SAAAA,qCAAU,iCAAmDJ,KAA/CK,MAAAA,+BAAO,8BAAwCL,KAApCM,MAAAA,+BAAO,qCAA6BN,KAAzBO,aAAAA,6CAAc;IAEtF,IAAMC,UAAoB,EAAE;IAE5B,IAAIF,MAAME,QAAQC,IAAI,CAAC,AAAC,SAAa,OAALH;IAChC,IAAIL,MAAMA,GAAGS,MAAM,EAAEF,QAAQC,IAAI,CAAC,AAAC,OAA6C,OAAvCE,MAAMC,OAAO,CAACX,MAAMA,GAAGY,IAAI,CAAC,QAAQZ;IAC7E,IAAIC,MAAMA,GAAGQ,MAAM,EAAEF,QAAQC,IAAI,CAAC,AAAC,OAA6C,OAAvCE,MAAMC,OAAO,CAACV,MAAMA,GAAGW,IAAI,CAAC,QAAQX;IAC7E,IAAIC,OAAOA,IAAIO,MAAM,EAAEF,QAAQC,IAAI,CAAC,AAAC,QAAiD,OAA1CE,MAAMC,OAAO,CAACT,OAAOA,IAAIU,IAAI,CAAC,QAAQV;IAClF,IAAIC,SAASI,QAAQC,IAAI,CAAC,AAAC,YAAmB,OAARL;IAEtCI,QAAQC,IAAI,CAAC;IACb,IAAMK,WAAWP,gBAAgB,SAAS,cAAc;IACxDC,QAAQC,IAAI,CAAC,AAAC,iBAAyB,OAATK,UAAS;IAEvC,OAAO,AAAC,GAAiCT,OAA/BG,QAAQK,IAAI,CAAC,SAAQ,YAAe,OAALR;AAC3C"}
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "fetchMessage", {
8
8
  return fetchMessage;
9
9
  }
10
10
  });
11
- var _dateconversion = require("../../lib/date-conversion.js");
12
- var _headersutils = require("../parsing/headers-utils.js");
11
+ var _dateconversionts = require("../../lib/date-conversion.js");
12
+ var _headersutilsts = require("../parsing/headers-utils.js");
13
13
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
14
14
  try {
15
15
  var info = gen[key](arg);
@@ -305,10 +305,10 @@ function fetchMessage(deps, id, mode) {
305
305
  toRaw = extractHeader(headers, 'To');
306
306
  ccRaw = extractHeader(headers, 'Cc');
307
307
  bccRaw = extractHeader(headers, 'Bcc');
308
- fromObj = (_ref = fromRaw ? (0, _headersutils.extractFrom)(fromRaw) : undefined) !== null && _ref !== void 0 ? _ref : undefined;
309
- toArr = toRaw ? (0, _headersutils.extractEmails)(toRaw) : [];
310
- ccArr = ccRaw ? (0, _headersutils.extractEmails)(ccRaw) : [];
311
- bccArr = bccRaw ? (0, _headersutils.extractEmails)(bccRaw) : [];
308
+ fromObj = (_ref = fromRaw ? (0, _headersutilsts.extractFrom)(fromRaw) : undefined) !== null && _ref !== void 0 ? _ref : undefined;
309
+ toArr = toRaw ? (0, _headersutilsts.extractEmails)(toRaw) : [];
310
+ ccArr = ccRaw ? (0, _headersutilsts.extractEmails)(ccRaw) : [];
311
+ bccArr = bccRaw ? (0, _headersutilsts.extractEmails)(bccRaw) : [];
312
312
  getId = function() {
313
313
  if (data && (typeof data === "undefined" ? "undefined" : _type_of(data)) === 'object' && 'id' in data) {
314
314
  var _data_id;
@@ -343,7 +343,7 @@ function fetchMessage(deps, id, mode) {
343
343
  msg = {
344
344
  id: getId(),
345
345
  threadId: getThreadId(),
346
- date: dateRaw ? (_toIsoUtc = (0, _dateconversion.toIsoUtc)(dateRaw)) !== null && _toIsoUtc !== void 0 ? _toIsoUtc : dateRaw : undefined,
346
+ date: dateRaw ? (_toIsoUtc = (0, _dateconversionts.toIsoUtc)(dateRaw)) !== null && _toIsoUtc !== void 0 ? _toIsoUtc : dateRaw : undefined,
347
347
  subject: extractHeader(headers, 'Subject'),
348
348
  from: fromObj,
349
349
  to: toArr.length ? toArr : undefined,
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/messages/fetch-message.ts"],"sourcesContent":["import type { gmail_v1 } from 'googleapis';\nimport { toIsoUtc } from '../../lib/date-conversion.js';\nimport { extractEmails, extractFrom } from '../parsing/headers-utils.js';\n\nexport type FetchMode = 'metadata' | 'full';\n\nexport interface NormalizedAddress {\n address?: string | undefined;\n name?: string | undefined;\n}\nexport interface NormalizedMessage {\n id: string;\n threadId?: string | undefined;\n date?: string | undefined;\n subject?: string | undefined;\n from?: NormalizedAddress | undefined;\n to?: string[] | undefined;\n cc?: string[] | undefined;\n bcc?: string[] | undefined;\n snippet?: string | undefined;\n labels?: string[] | undefined;\n body?: string | undefined;\n}\n\nexport interface GmailDeps {\n /** googleapis Gmail client created via createGmailClient(provider). */\n gmail: gmail_v1.Gmail;\n}\n\nfunction extractHeader(headers: Array<{ name?: string; value?: string }> | undefined, key: string): string | undefined {\n const h = headers?.find((x) => (x.name ?? '').toLowerCase() === key.toLowerCase());\n return h?.value ?? undefined;\n}\n\nfunction base64UrlDecode(input: string): string {\n let s = String(input).replace(/-/g, '+').replace(/_/g, '/');\n while (s.length % 4 !== 0) s += '=';\n try {\n return Buffer.from(s, 'base64').toString('utf8');\n } catch {\n return '';\n }\n}\n\nfunction extractBody(payload: unknown): string | undefined {\n const find = (parts: unknown[] | undefined, mime: string): string | undefined => {\n for (const p of parts ?? []) {\n if (p && typeof p === 'object' && 'mimeType' in p && 'body' in p) {\n if (p.mimeType === mime && p.body && typeof p.body === 'object' && 'data' in p.body) {\n return base64UrlDecode(p.body.data as string);\n }\n }\n if (p && typeof p === 'object' && 'parts' in p) {\n const nested = find(p.parts as unknown[], mime);\n if (nested) return nested;\n }\n }\n return undefined;\n };\n if (payload && typeof payload === 'object' && 'parts' in payload) {\n return find(payload.parts as unknown[], 'text/plain') ?? find(payload.parts as unknown[], 'text/html')?.replace(/\\r\\n?/g, '\\n');\n }\n return undefined;\n}\n\nexport async function fetchMessage(deps: GmailDeps, id: string, mode: FetchMode): Promise<NormalizedMessage> {\n const { gmail } = deps;\n // When only metadata is requested, ask Gmail for a reduced payload with just the headers we care about.\n const metadataHeaders = ['Date', 'Subject', 'From', 'To', 'Cc', 'Bcc'];\n const format = mode === 'full' ? 'full' : 'metadata';\n const baseParams = { userId: 'me' as const, id, format };\n const resp = format === 'metadata' ? await gmail.users.messages.get({ ...baseParams, metadataHeaders }) : await gmail.users.messages.get(baseParams);\n const data = resp?.data as unknown;\n const headers = data && typeof data === 'object' && 'payload' in data && data.payload && typeof data.payload === 'object' && 'headers' in data.payload ? (data.payload.headers as Array<{ name?: string; value?: string }> | undefined) : undefined;\n const dateRaw = extractHeader(headers, 'Date');\n const fromRaw = extractHeader(headers, 'From');\n const toRaw = extractHeader(headers, 'To');\n const ccRaw = extractHeader(headers, 'Cc');\n const bccRaw = extractHeader(headers, 'Bcc');\n\n const fromObj = (fromRaw ? (extractFrom(fromRaw) as NormalizedAddress) : undefined) ?? undefined;\n const toArr = toRaw ? extractEmails(toRaw) : [];\n const ccArr = ccRaw ? extractEmails(ccRaw) : [];\n const bccArr = bccRaw ? extractEmails(bccRaw) : [];\n\n const getId = (): string => {\n if (data && typeof data === 'object' && 'id' in data) {\n return String(data.id ?? id);\n }\n return id;\n };\n\n const getThreadId = (): string | undefined => {\n if (data && typeof data === 'object' && 'threadId' in data && data.threadId) {\n return String(data.threadId);\n }\n return undefined;\n };\n\n const getSnippet = (): string | undefined => {\n if (data && typeof data === 'object' && 'snippet' in data && data.snippet) {\n return String(data.snippet);\n }\n return undefined;\n };\n\n const getLabelIds = (): string[] | undefined => {\n if (data && typeof data === 'object' && 'labelIds' in data && Array.isArray(data.labelIds)) {\n return data.labelIds.map(String);\n }\n return undefined;\n };\n\n const getPayload = (): unknown => {\n if (data && typeof data === 'object' && 'payload' in data) {\n return data.payload;\n }\n return undefined;\n };\n\n const msg: NormalizedMessage = {\n id: getId(),\n threadId: getThreadId(),\n date: dateRaw ? (toIsoUtc(dateRaw) ?? dateRaw) : undefined,\n subject: extractHeader(headers, 'Subject'),\n from: fromObj,\n to: toArr.length ? toArr : undefined,\n cc: ccArr.length ? ccArr : undefined,\n bcc: bccArr.length ? bccArr : undefined,\n snippet: getSnippet(),\n labels: getLabelIds(),\n };\n if (mode === 'full') {\n const body = extractBody(getPayload());\n if (body) msg.body = body;\n }\n return msg;\n}\n"],"names":["fetchMessage","extractHeader","headers","key","h","find","x","name","toLowerCase","value","undefined","base64UrlDecode","input","s","String","replace","length","Buffer","from","toString","extractBody","payload","parts","mime","p","mimeType","body","data","nested","deps","id","mode","fromRaw","toIsoUtc","gmail","metadataHeaders","format","baseParams","resp","dateRaw","toRaw","ccRaw","bccRaw","fromObj","toArr","ccArr","bccArr","getId","getThreadId","getSnippet","getLabelIds","getPayload","msg","userId","users","messages","get","extractFrom","extractEmails","threadId","snippet","Array","isArray","labelIds","map","date","subject","to","cc","bcc","labels"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/messages/fetch-message.ts"],"sourcesContent":["import type { gmail_v1 } from 'googleapis';\nimport { toIsoUtc } from '../../lib/date-conversion.ts';\nimport { extractEmails, extractFrom } from '../parsing/headers-utils.ts';\n\nexport type FetchMode = 'metadata' | 'full';\n\nexport interface NormalizedAddress {\n address?: string | undefined;\n name?: string | undefined;\n}\nexport interface NormalizedMessage {\n id: string;\n threadId?: string | undefined;\n date?: string | undefined;\n subject?: string | undefined;\n from?: NormalizedAddress | undefined;\n to?: string[] | undefined;\n cc?: string[] | undefined;\n bcc?: string[] | undefined;\n snippet?: string | undefined;\n labels?: string[] | undefined;\n body?: string | undefined;\n}\n\nexport interface GmailDeps {\n /** googleapis Gmail client created via createGmailClient(provider). */\n gmail: gmail_v1.Gmail;\n}\n\nfunction extractHeader(headers: Array<{ name?: string; value?: string }> | undefined, key: string): string | undefined {\n const h = headers?.find((x) => (x.name ?? '').toLowerCase() === key.toLowerCase());\n return h?.value ?? undefined;\n}\n\nfunction base64UrlDecode(input: string): string {\n let s = String(input).replace(/-/g, '+').replace(/_/g, '/');\n while (s.length % 4 !== 0) s += '=';\n try {\n return Buffer.from(s, 'base64').toString('utf8');\n } catch {\n return '';\n }\n}\n\nfunction extractBody(payload: unknown): string | undefined {\n const find = (parts: unknown[] | undefined, mime: string): string | undefined => {\n for (const p of parts ?? []) {\n if (p && typeof p === 'object' && 'mimeType' in p && 'body' in p) {\n if (p.mimeType === mime && p.body && typeof p.body === 'object' && 'data' in p.body) {\n return base64UrlDecode(p.body.data as string);\n }\n }\n if (p && typeof p === 'object' && 'parts' in p) {\n const nested = find(p.parts as unknown[], mime);\n if (nested) return nested;\n }\n }\n return undefined;\n };\n if (payload && typeof payload === 'object' && 'parts' in payload) {\n return find(payload.parts as unknown[], 'text/plain') ?? find(payload.parts as unknown[], 'text/html')?.replace(/\\r\\n?/g, '\\n');\n }\n return undefined;\n}\n\nexport async function fetchMessage(deps: GmailDeps, id: string, mode: FetchMode): Promise<NormalizedMessage> {\n const { gmail } = deps;\n // When only metadata is requested, ask Gmail for a reduced payload with just the headers we care about.\n const metadataHeaders = ['Date', 'Subject', 'From', 'To', 'Cc', 'Bcc'];\n const format = mode === 'full' ? 'full' : 'metadata';\n const baseParams = { userId: 'me' as const, id, format };\n const resp = format === 'metadata' ? await gmail.users.messages.get({ ...baseParams, metadataHeaders }) : await gmail.users.messages.get(baseParams);\n const data = resp?.data as unknown;\n const headers = data && typeof data === 'object' && 'payload' in data && data.payload && typeof data.payload === 'object' && 'headers' in data.payload ? (data.payload.headers as Array<{ name?: string; value?: string }> | undefined) : undefined;\n const dateRaw = extractHeader(headers, 'Date');\n const fromRaw = extractHeader(headers, 'From');\n const toRaw = extractHeader(headers, 'To');\n const ccRaw = extractHeader(headers, 'Cc');\n const bccRaw = extractHeader(headers, 'Bcc');\n\n const fromObj = (fromRaw ? (extractFrom(fromRaw) as NormalizedAddress) : undefined) ?? undefined;\n const toArr = toRaw ? extractEmails(toRaw) : [];\n const ccArr = ccRaw ? extractEmails(ccRaw) : [];\n const bccArr = bccRaw ? extractEmails(bccRaw) : [];\n\n const getId = (): string => {\n if (data && typeof data === 'object' && 'id' in data) {\n return String(data.id ?? id);\n }\n return id;\n };\n\n const getThreadId = (): string | undefined => {\n if (data && typeof data === 'object' && 'threadId' in data && data.threadId) {\n return String(data.threadId);\n }\n return undefined;\n };\n\n const getSnippet = (): string | undefined => {\n if (data && typeof data === 'object' && 'snippet' in data && data.snippet) {\n return String(data.snippet);\n }\n return undefined;\n };\n\n const getLabelIds = (): string[] | undefined => {\n if (data && typeof data === 'object' && 'labelIds' in data && Array.isArray(data.labelIds)) {\n return data.labelIds.map(String);\n }\n return undefined;\n };\n\n const getPayload = (): unknown => {\n if (data && typeof data === 'object' && 'payload' in data) {\n return data.payload;\n }\n return undefined;\n };\n\n const msg: NormalizedMessage = {\n id: getId(),\n threadId: getThreadId(),\n date: dateRaw ? (toIsoUtc(dateRaw) ?? dateRaw) : undefined,\n subject: extractHeader(headers, 'Subject'),\n from: fromObj,\n to: toArr.length ? toArr : undefined,\n cc: ccArr.length ? ccArr : undefined,\n bcc: bccArr.length ? bccArr : undefined,\n snippet: getSnippet(),\n labels: getLabelIds(),\n };\n if (mode === 'full') {\n const body = extractBody(getPayload());\n if (body) msg.body = body;\n }\n return msg;\n}\n"],"names":["fetchMessage","extractHeader","headers","key","h","find","x","name","toLowerCase","value","undefined","base64UrlDecode","input","s","String","replace","length","Buffer","from","toString","extractBody","payload","parts","mime","p","mimeType","body","data","nested","deps","id","mode","fromRaw","toIsoUtc","gmail","metadataHeaders","format","baseParams","resp","dateRaw","toRaw","ccRaw","bccRaw","fromObj","toArr","ccArr","bccArr","getId","getThreadId","getSnippet","getLabelIds","getPayload","msg","userId","users","messages","get","extractFrom","extractEmails","threadId","snippet","Array","isArray","labelIds","map","date","subject","to","cc","bcc","labels"],"mappings":";;;;+BAiEsBA;;;eAAAA;;;gCAhEG;8BACkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2B3C,SAASC,cAAcC,OAA6D,EAAEC,GAAW;;IAC/F,IAAMC,IAAIF,oBAAAA,8BAAAA,QAASG,IAAI,CAAC,SAACC;YAAOA;eAAD,EAACA,UAAAA,EAAEC,IAAI,cAAND,qBAAAA,UAAU,IAAIE,WAAW,OAAOL,IAAIK,WAAW;;IAC/E,eAAOJ,cAAAA,wBAAAA,EAAGK,KAAK,uCAAIC;AACrB;AAEA,SAASC,gBAAgBC,KAAa;IACpC,IAAIC,IAAIC,OAAOF,OAAOG,OAAO,CAAC,MAAM,KAAKA,OAAO,CAAC,MAAM;IACvD,MAAOF,EAAEG,MAAM,GAAG,MAAM,EAAGH,KAAK;IAChC,IAAI;QACF,OAAOI,OAAOC,IAAI,CAACL,GAAG,UAAUM,QAAQ,CAAC;IAC3C,EAAE,eAAM;QACN,OAAO;IACT;AACF;AAEA,SAASC,YAAYC,OAAgB;IACnC,IAAMhB,OAAO,SAACiB,OAA8BC;YACrC,kCAAA,2BAAA;;YAAL,QAAK,aAAWD,kBAAAA,mBAAAA,QAAS,EAAE,sBAAtB,SAAA,6BAAA,QAAA,yBAAA,iCAAwB;gBAAxB,IAAME,IAAN;gBACH,IAAIA,KAAK,CAAA,OAAOA,kCAAP,SAAOA,EAAAA,MAAM,YAAY,cAAcA,KAAK,UAAUA,GAAG;oBAChE,IAAIA,EAAEC,QAAQ,KAAKF,QAAQC,EAAEE,IAAI,IAAI,SAAOF,EAAEE,IAAI,MAAK,YAAY,UAAUF,EAAEE,IAAI,EAAE;wBACnF,OAAOf,gBAAgBa,EAAEE,IAAI,CAACC,IAAI;oBACpC;gBACF;gBACA,IAAIH,KAAK,CAAA,OAAOA,kCAAP,SAAOA,EAAAA,MAAM,YAAY,WAAWA,GAAG;oBAC9C,IAAMI,SAASvB,KAAKmB,EAAEF,KAAK,EAAeC;oBAC1C,IAAIK,QAAQ,OAAOA;gBACrB;YACF;;YAVK;YAAA;;;qBAAA,6BAAA;oBAAA;;;oBAAA;0BAAA;;;;QAWL,OAAOlB;IACT;IACA,IAAIW,WAAW,CAAA,OAAOA,wCAAP,SAAOA,QAAM,MAAM,YAAY,WAAWA,SAAS;YACzDhB;YAAkDA;QAAzD,QAAOA,QAAAA,KAAKgB,QAAQC,KAAK,EAAe,2BAAjCjB,mBAAAA,SAAkDA,SAAAA,KAAKgB,QAAQC,KAAK,EAAe,0BAAjCjB,6BAAAA,OAA+CU,OAAO,CAAC,UAAU;IAC5H;IACA,OAAOL;AACT;AAEO,SAAeV,aAAa6B,IAAe,EAAEC,EAAU,EAAEC,IAAe;;YAe5DC,MA2CEC,WAzDXC,OAEFC,iBACAC,QACAC,YACAC,YACAX,MACAzB,SACAqC,SACAP,SACAQ,OACAC,OACAC,QAEAC,SACAC,OACAC,OACAC,QAEAC,OAOAC,aAOAC,YAOAC,aAOAC,YAOAC,KAaE1B;;;;oBAnEAQ,QAAUL,KAAVK;oBACR,wGAAwG;oBAClGC;wBAAmB;wBAAQ;wBAAW;wBAAQ;wBAAM;wBAAM;;oBAC1DC,SAASL,SAAS,SAAS,SAAS;oBACpCM,aAAa;wBAAEgB,QAAQ;wBAAevB,IAAAA;wBAAIM,QAAAA;oBAAO;yBAC1CA,CAAAA,WAAW,UAAS,GAApBA;;;;oBAAwB;;wBAAMF,MAAMoB,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC,wCAAKnB;4BAAYF,iBAAAA;;;;2BAAhD;;;;;;oBAAqE;;wBAAMD,MAAMoB,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACnB;;;2BAA/B;;;oBAApGC;oBACAX,OAAOW,iBAAAA,2BAAAA,KAAMX,IAAI;oBACjBzB,UAAUyB,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,aAAaA,QAAQA,KAAKN,OAAO,IAAI,SAAOM,KAAKN,OAAO,MAAK,YAAY,aAAaM,KAAKN,OAAO,GAAIM,KAAKN,OAAO,CAACnB,OAAO,GAA4DQ;oBACpO6B,UAAUtC,cAAcC,SAAS;oBACjC8B,UAAU/B,cAAcC,SAAS;oBACjCsC,QAAQvC,cAAcC,SAAS;oBAC/BuC,QAAQxC,cAAcC,SAAS;oBAC/BwC,SAASzC,cAAcC,SAAS;oBAEhCyC,WAAWX,OAAAA,UAAWyB,IAAAA,2BAAW,EAACzB,WAAiCtB,uBAAxDsB,kBAAAA,OAAsEtB;oBACjFkC,QAAQJ,QAAQkB,IAAAA,6BAAa,EAAClB;oBAC9BK,QAAQJ,QAAQiB,IAAAA,6BAAa,EAACjB;oBAC9BK,SAASJ,SAASgB,IAAAA,6BAAa,EAAChB;oBAEhCK,QAAQ;wBACZ,IAAIpB,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,QAAQA,MAAM;gCACtCA;4BAAd,OAAOb,QAAOa,WAAAA,KAAKG,EAAE,cAAPH,sBAAAA,WAAWG;wBAC3B;wBACA,OAAOA;oBACT;oBAEMkB,cAAc;wBAClB,IAAIrB,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,cAAcA,QAAQA,KAAKgC,QAAQ,EAAE;4BAC3E,OAAO7C,OAAOa,KAAKgC,QAAQ;wBAC7B;wBACA,OAAOjD;oBACT;oBAEMuC,aAAa;wBACjB,IAAItB,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,aAAaA,QAAQA,KAAKiC,OAAO,EAAE;4BACzE,OAAO9C,OAAOa,KAAKiC,OAAO;wBAC5B;wBACA,OAAOlD;oBACT;oBAEMwC,cAAc;wBAClB,IAAIvB,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,cAAcA,QAAQkC,MAAMC,OAAO,CAACnC,KAAKoC,QAAQ,GAAG;4BAC1F,OAAOpC,KAAKoC,QAAQ,CAACC,GAAG,CAAClD;wBAC3B;wBACA,OAAOJ;oBACT;oBAEMyC,aAAa;wBACjB,IAAIxB,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,aAAaA,MAAM;4BACzD,OAAOA,KAAKN,OAAO;wBACrB;wBACA,OAAOX;oBACT;oBAEM0C,MAAyB;wBAC7BtB,IAAIiB;wBACJY,UAAUX;wBACViB,MAAM1B,WAAWN,YAAAA,IAAAA,0BAAQ,EAACM,sBAATN,uBAAAA,YAAqBM,UAAW7B;wBACjDwD,SAASjE,cAAcC,SAAS;wBAChCgB,MAAMyB;wBACNwB,IAAIvB,MAAM5B,MAAM,GAAG4B,QAAQlC;wBAC3B0D,IAAIvB,MAAM7B,MAAM,GAAG6B,QAAQnC;wBAC3B2D,KAAKvB,OAAO9B,MAAM,GAAG8B,SAASpC;wBAC9BkD,SAASX;wBACTqB,QAAQpB;oBACV;oBACA,IAAInB,SAAS,QAAQ;wBACbL,OAAON,YAAY+B;wBACzB,IAAIzB,MAAM0B,IAAI1B,IAAI,GAAGA;oBACvB;oBACA;;wBAAO0B;;;;IACT"}
@@ -17,9 +17,9 @@ _export(exports, {
17
17
  }
18
18
  });
19
19
  var _email = require("@mcp-z/email");
20
- var _base64encoding = require("../../lib/base64-encoding.js");
21
- var _dateconversion = require("../../lib/date-conversion.js");
22
- var _headersutils = require("../parsing/headers-utils.js");
20
+ var _base64encodingts = require("../../lib/base64-encoding.js");
21
+ var _dateconversionts = require("../../lib/date-conversion.js");
22
+ var _headersutilsts = require("../parsing/headers-utils.js");
23
23
  function _type_of(obj) {
24
24
  "@swc/helpers - typeof";
25
25
  return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
@@ -42,12 +42,12 @@ function toRowFromGmail() {
42
42
  var id = (_ref = msg === null || msg === void 0 ? void 0 : msg.id) !== null && _ref !== void 0 ? _ref : '';
43
43
  var provider = 'gmail';
44
44
  var threadId = (_ref1 = msg === null || msg === void 0 ? void 0 : msg.threadId) !== null && _ref1 !== void 0 ? _ref1 : '';
45
- var to = (0, _headersutils.extractEmails)((_headerObj_To = headerObj.To) !== null && _headerObj_To !== void 0 ? _headerObj_To : '').join(', ');
46
- var fromInfo = (0, _headersutils.extractFrom)((_headerObj_From = headerObj.From) !== null && _headerObj_From !== void 0 ? _headerObj_From : '');
45
+ var to = (0, _headersutilsts.extractEmails)((_headerObj_To = headerObj.To) !== null && _headerObj_To !== void 0 ? _headerObj_To : '').join(', ');
46
+ var fromInfo = (0, _headersutilsts.extractFrom)((_headerObj_From = headerObj.From) !== null && _headerObj_From !== void 0 ? _headerObj_From : '');
47
47
  var from = (_ref2 = fromInfo && fromInfo.address || headerObj.From) !== null && _ref2 !== void 0 ? _ref2 : '';
48
- var cc = (0, _headersutils.extractEmails)((_headerObj_Cc = headerObj.Cc) !== null && _headerObj_Cc !== void 0 ? _headerObj_Cc : '').join(', ');
49
- var bcc = (0, _headersutils.extractEmails)((_headerObj_Bcc = headerObj.Bcc) !== null && _headerObj_Bcc !== void 0 ? _headerObj_Bcc : '').join(', ');
50
- var date = (_ref3 = (0, _dateconversion.toIsoUtc)(headerObj.Date) || headerObj.Date) !== null && _ref3 !== void 0 ? _ref3 : '';
48
+ var cc = (0, _headersutilsts.extractEmails)((_headerObj_Cc = headerObj.Cc) !== null && _headerObj_Cc !== void 0 ? _headerObj_Cc : '').join(', ');
49
+ var bcc = (0, _headersutilsts.extractEmails)((_headerObj_Bcc = headerObj.Bcc) !== null && _headerObj_Bcc !== void 0 ? _headerObj_Bcc : '').join(', ');
50
+ var date = (_ref3 = (0, _dateconversionts.toIsoUtc)(headerObj.Date) || headerObj.Date) !== null && _ref3 !== void 0 ? _ref3 : '';
51
51
  var subject = (_headerObj_Subject = headerObj.Subject) !== null && _headerObj_Subject !== void 0 ? _headerObj_Subject : '';
52
52
  var labelIds = Array.isArray(msg === null || msg === void 0 ? void 0 : msg.labelIds) ? msg.labelIds : [];
53
53
  var labels = labelIds.join(';');
@@ -89,7 +89,7 @@ function toRowFromGmail() {
89
89
  };
90
90
  var raw = findText(parts) || ((msg === null || msg === void 0 ? void 0 : (_msg_payload2 = msg.payload) === null || _msg_payload2 === void 0 ? void 0 : _msg_payload2.body) && _type_of(msg.payload.body) === 'object' && 'data' in msg.payload.body ? msg.payload.body.data : null) || null;
91
91
  if (raw) {
92
- bodyFull = (0, _base64encoding.safeBase64Decode)(raw);
92
+ bodyFull = (0, _base64encodingts.safeBase64Decode)(raw);
93
93
  } else {
94
94
  var findHtml = function(partsArr) {
95
95
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
@@ -124,7 +124,7 @@ function toRowFromGmail() {
124
124
  };
125
125
  var htmlPart = findHtml(parts);
126
126
  if (htmlPart) {
127
- bodyFull = (0, _base64encoding.safeBase64Decode)(htmlPart).replace(/\r\n?/g, '\n');
127
+ bodyFull = (0, _base64encodingts.safeBase64Decode)(htmlPart).replace(/\r\n?/g, '\n');
128
128
  }
129
129
  }
130
130
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/messages/messages.ts"],"sourcesContent":["import { buildContentForItems } from '@mcp-z/email';\nimport type { gmail_v1 } from 'googleapis';\nimport { safeBase64Decode } from '../../lib/base64-encoding.js';\nimport { toIsoUtc } from '../../lib/date-conversion.js';\nimport { extractEmails, extractFrom } from '../parsing/headers-utils.js';\n\nexport { buildContentForItems };\n\n// Convert a Gmail messages.get() response into canonical row shape used by sheets writer\n// [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, body]\nexport function toRowFromGmail(msg: gmail_v1.Schema$Message = {}, opts: { body?: boolean; addressFormat?: 'email' | string } = { body: false, addressFormat: 'email' }) {\n const headers = msg?.payload?.headers || [];\n const headerObj: Record<string, string> = Object.fromEntries((headers || []).map((h) => [String(h?.name ?? ''), String(h?.value ?? '')]));\n const id = msg?.id ?? '';\n const provider = 'gmail';\n const threadId = msg?.threadId ?? '';\n const to = extractEmails(headerObj.To ?? '').join(', ');\n const fromInfo = extractFrom(headerObj.From ?? '');\n const from = ((fromInfo && fromInfo.address) || headerObj.From) ?? '';\n const cc = extractEmails(headerObj.Cc ?? '').join(', ');\n const bcc = extractEmails(headerObj.Bcc ?? '').join(', ');\n const date = (toIsoUtc(headerObj.Date) || headerObj.Date) ?? '';\n const subject = headerObj.Subject ?? '';\n const labelIds = Array.isArray(msg?.labelIds) ? (msg.labelIds as string[]) : [];\n const labels = labelIds.join(';');\n const snippet = msg?.snippet ?? '';\n\n let bodyFull = '';\n if (opts?.body) {\n const parts = msg?.payload?.parts || [];\n const findText = (partsArr: unknown[]): string | null => {\n for (const p of partsArr || []) {\n if (p && typeof p === 'object' && 'mimeType' in p && 'body' in p) {\n if (p.mimeType === 'text/plain' && p.body && typeof p.body === 'object' && 'data' in p.body) {\n return p.body.data as string;\n }\n }\n if (p && typeof p === 'object' && 'parts' in p) {\n const nested = findText(p.parts as unknown[]);\n if (nested) return nested;\n }\n }\n return null;\n };\n const raw = findText(parts as unknown[]) || (msg?.payload?.body && typeof msg.payload.body === 'object' && 'data' in msg.payload.body ? msg.payload.body.data : null) || null;\n if (raw) {\n bodyFull = safeBase64Decode(raw as string);\n } else {\n const findHtml = (partsArr: unknown[]): string | null => {\n for (const p of partsArr || []) {\n if (p && typeof p === 'object' && 'mimeType' in p && 'body' in p) {\n if (p.mimeType === 'text/html' && p.body && typeof p.body === 'object' && 'data' in p.body) {\n return p.body.data as string;\n }\n }\n if (p && typeof p === 'object' && 'parts' in p) {\n const nested = findHtml(p.parts as unknown[]);\n if (nested) return nested;\n }\n }\n return null;\n };\n const htmlPart = findHtml(parts as unknown[]);\n if (htmlPart) {\n bodyFull = safeBase64Decode(htmlPart).replace(/\\r\\n?/g, '\\n');\n }\n }\n }\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, bodyFull];\n}\n"],"names":["buildContentForItems","toRowFromGmail","msg","opts","body","addressFormat","headerObj","toIsoUtc","headers","payload","Object","fromEntries","map","h","String","name","value","id","provider","threadId","to","extractEmails","To","join","fromInfo","extractFrom","From","from","address","cc","Cc","bcc","Bcc","date","Date","subject","Subject","labelIds","Array","isArray","labels","snippet","bodyFull","parts","findText","partsArr","p","mimeType","data","nested","raw","safeBase64Decode","findHtml","htmlPart","replace"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/messages/messages.ts"],"sourcesContent":["import { buildContentForItems } from '@mcp-z/email';\nimport type { gmail_v1 } from 'googleapis';\nimport { safeBase64Decode } from '../../lib/base64-encoding.ts';\nimport { toIsoUtc } from '../../lib/date-conversion.ts';\nimport { extractEmails, extractFrom } from '../parsing/headers-utils.ts';\n\nexport { buildContentForItems };\n\n// Convert a Gmail messages.get() response into canonical row shape used by sheets writer\n// [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, body]\nexport function toRowFromGmail(msg: gmail_v1.Schema$Message = {}, opts: { body?: boolean; addressFormat?: 'email' | string } = { body: false, addressFormat: 'email' }) {\n const headers = msg?.payload?.headers || [];\n const headerObj: Record<string, string> = Object.fromEntries((headers || []).map((h) => [String(h?.name ?? ''), String(h?.value ?? '')]));\n const id = msg?.id ?? '';\n const provider = 'gmail';\n const threadId = msg?.threadId ?? '';\n const to = extractEmails(headerObj.To ?? '').join(', ');\n const fromInfo = extractFrom(headerObj.From ?? '');\n const from = ((fromInfo && fromInfo.address) || headerObj.From) ?? '';\n const cc = extractEmails(headerObj.Cc ?? '').join(', ');\n const bcc = extractEmails(headerObj.Bcc ?? '').join(', ');\n const date = (toIsoUtc(headerObj.Date) || headerObj.Date) ?? '';\n const subject = headerObj.Subject ?? '';\n const labelIds = Array.isArray(msg?.labelIds) ? (msg.labelIds as string[]) : [];\n const labels = labelIds.join(';');\n const snippet = msg?.snippet ?? '';\n\n let bodyFull = '';\n if (opts?.body) {\n const parts = msg?.payload?.parts || [];\n const findText = (partsArr: unknown[]): string | null => {\n for (const p of partsArr || []) {\n if (p && typeof p === 'object' && 'mimeType' in p && 'body' in p) {\n if (p.mimeType === 'text/plain' && p.body && typeof p.body === 'object' && 'data' in p.body) {\n return p.body.data as string;\n }\n }\n if (p && typeof p === 'object' && 'parts' in p) {\n const nested = findText(p.parts as unknown[]);\n if (nested) return nested;\n }\n }\n return null;\n };\n const raw = findText(parts as unknown[]) || (msg?.payload?.body && typeof msg.payload.body === 'object' && 'data' in msg.payload.body ? msg.payload.body.data : null) || null;\n if (raw) {\n bodyFull = safeBase64Decode(raw as string);\n } else {\n const findHtml = (partsArr: unknown[]): string | null => {\n for (const p of partsArr || []) {\n if (p && typeof p === 'object' && 'mimeType' in p && 'body' in p) {\n if (p.mimeType === 'text/html' && p.body && typeof p.body === 'object' && 'data' in p.body) {\n return p.body.data as string;\n }\n }\n if (p && typeof p === 'object' && 'parts' in p) {\n const nested = findHtml(p.parts as unknown[]);\n if (nested) return nested;\n }\n }\n return null;\n };\n const htmlPart = findHtml(parts as unknown[]);\n if (htmlPart) {\n bodyFull = safeBase64Decode(htmlPart).replace(/\\r\\n?/g, '\\n');\n }\n }\n }\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, bodyFull];\n}\n"],"names":["buildContentForItems","toRowFromGmail","msg","opts","body","addressFormat","headerObj","toIsoUtc","headers","payload","Object","fromEntries","map","h","String","name","value","id","provider","threadId","to","extractEmails","To","join","fromInfo","extractFrom","From","from","address","cc","Cc","bcc","Bcc","date","Date","subject","Subject","labelIds","Array","isArray","labels","snippet","bodyFull","parts","findText","partsArr","p","mimeType","data","nested","raw","safeBase64Decode","findHtml","htmlPart","replace"],"mappings":"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"}
@@ -10,11 +10,11 @@ function _export(target, all) {
10
10
  }
11
11
  _export(exports, {
12
12
  get extractEmails () {
13
- return _headersutils.extractEmails;
13
+ return _headersutilsts.extractEmails;
14
14
  },
15
15
  get extractFrom () {
16
- return _headersutils.extractFrom;
16
+ return _headersutilsts.extractFrom;
17
17
  }
18
18
  });
19
- var _headersutils = require("./headers-utils.js");
19
+ var _headersutilsts = require("./headers-utils.js");
20
20
  /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/parsing/header-parsing.ts"],"sourcesContent":["export { extractEmails, extractFrom } from './headers-utils.js';\n"],"names":["extractEmails","extractFrom"],"mappings":";;;;;;;;;;;QAASA;eAAAA,2BAAa;;QAAEC;eAAAA,yBAAW;;;4BAAQ"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/parsing/header-parsing.ts"],"sourcesContent":["export { extractEmails, extractFrom } from './headers-utils.ts';\n"],"names":["extractEmails","extractFrom"],"mappings":";;;;;;;;;;;QAASA;eAAAA,6BAAa;;QAAEC;eAAAA,2BAAW;;;8BAAQ"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/parsing/headers-utils.ts"],"sourcesContent":["export function extractEmails(header?: string): string[] {\n if (!header) return [];\n const matches = header.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi) || [];\n return matches.map((s: string) => s.trim());\n}\n\nexport function extractFrom(header?: string): { address?: string; name?: string } | undefined {\n if (!header) return undefined;\n const m = header.match(/^(.*)<([^>]+)>/);\n if (m) {\n const rawName = m[1];\n const name = rawName ? rawName.replace(/\"/g, '').trim() : undefined;\n const addr = m[2] ? m[2].trim() : undefined;\n const result: { address?: string; name?: string } = {};\n if (addr) result.address = addr;\n if (name) result.name = name;\n return result;\n }\n const emails = extractEmails(header);\n if (emails[0]) return { address: emails[0] };\n return { address: header.trim() };\n}\n"],"names":["extractEmails","extractFrom","header","matches","match","map","s","trim","undefined","m","rawName","name","replace","addr","result","address","emails"],"mappings":";;;;;;;;;;;QAAgBA;eAAAA;;QAMAC;eAAAA;;;AANT,SAASD,cAAcE,MAAe;IAC3C,IAAI,CAACA,QAAQ,OAAO,EAAE;IACtB,IAAMC,UAAUD,OAAOE,KAAK,CAAC,8CAA8C,EAAE;IAC7E,OAAOD,QAAQE,GAAG,CAAC,SAACC;eAAcA,EAAEC,IAAI;;AAC1C;AAEO,SAASN,YAAYC,MAAe;IACzC,IAAI,CAACA,QAAQ,OAAOM;IACpB,IAAMC,IAAIP,OAAOE,KAAK,CAAC;IACvB,IAAIK,GAAG;QACL,IAAMC,UAAUD,CAAC,CAAC,EAAE;QACpB,IAAME,OAAOD,UAAUA,QAAQE,OAAO,CAAC,MAAM,IAAIL,IAAI,KAAKC;QAC1D,IAAMK,OAAOJ,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,EAAE,CAACF,IAAI,KAAKC;QAClC,IAAMM,SAA8C,CAAC;QACrD,IAAID,MAAMC,OAAOC,OAAO,GAAGF;QAC3B,IAAIF,MAAMG,OAAOH,IAAI,GAAGA;QACxB,OAAOG;IACT;IACA,IAAME,SAAShB,cAAcE;IAC7B,IAAIc,MAAM,CAAC,EAAE,EAAE,OAAO;QAAED,SAASC,MAAM,CAAC,EAAE;IAAC;IAC3C,OAAO;QAAED,SAASb,OAAOK,IAAI;IAAG;AAClC"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/parsing/headers-utils.ts"],"sourcesContent":["export function extractEmails(header?: string): string[] {\n if (!header) return [];\n const matches = header.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi) || [];\n return matches.map((s: string) => s.trim());\n}\n\nexport function extractFrom(header?: string): { address?: string; name?: string } | undefined {\n if (!header) return undefined;\n const m = header.match(/^(.*)<([^>]+)>/);\n if (m) {\n const rawName = m[1];\n const name = rawName ? rawName.replace(/\"/g, '').trim() : undefined;\n const addr = m[2] ? m[2].trim() : undefined;\n const result: { address?: string; name?: string } = {};\n if (addr) result.address = addr;\n if (name) result.name = name;\n return result;\n }\n const emails = extractEmails(header);\n if (emails[0]) return { address: emails[0] };\n return { address: header.trim() };\n}\n"],"names":["extractEmails","extractFrom","header","matches","match","map","s","trim","undefined","m","rawName","name","replace","addr","result","address","emails"],"mappings":";;;;;;;;;;;QAAgBA;eAAAA;;QAMAC;eAAAA;;;AANT,SAASD,cAAcE,MAAe;IAC3C,IAAI,CAACA,QAAQ,OAAO,EAAE;IACtB,IAAMC,UAAUD,OAAOE,KAAK,CAAC,8CAA8C,EAAE;IAC7E,OAAOD,QAAQE,GAAG,CAAC,SAACC;eAAcA,EAAEC,IAAI;;AAC1C;AAEO,SAASN,YAAYC,MAAe;IACzC,IAAI,CAACA,QAAQ,OAAOM;IACpB,IAAMC,IAAIP,OAAOE,KAAK,CAAC;IACvB,IAAIK,GAAG;QACL,IAAMC,UAAUD,CAAC,CAAC,EAAE;QACpB,IAAME,OAAOD,UAAUA,QAAQE,OAAO,CAAC,MAAM,IAAIL,IAAI,KAAKC;QAC1D,IAAMK,OAAOJ,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,EAAE,CAACF,IAAI,KAAKC;QAClC,IAAMM,SAA8C,CAAC;QACrD,IAAID,MAAMC,OAAOC,OAAO,GAAGF;QAC3B,IAAIF,MAAMG,OAAOH,IAAI,GAAGA;QACxB,OAAOG;IACT;IACA,IAAME,SAAShB,cAAcE;IAC7B,IAAIc,MAAM,CAAC,EAAE,EAAE,OAAO;QAAED,SAASC,MAAM,CAAC,EAAE;IAAC;IAC3C,OAAO;QAAED,SAASb,OAAOK,IAAI;IAAG;AAClC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/parsing/html-processing.ts"],"sourcesContent":["import { extractCurrentMessageFromHtml } from '@mcp-z/email';\nimport type { gmail_v1 } from 'googleapis';\nimport { parse } from 'node-html-parser';\n\nexport interface BodyExtractionOptions {\n /** Format to return: 'text' extracts plain text, 'html' preserves HTML structure */\n contentType?: 'text' | 'html';\n /** When true, removes quoted thread history from HTML content */\n excludeThreadHistory?: boolean;\n}\n\nexport function extractBodyFromPayload(payload: gmail_v1.Schema$MessagePart, options: BodyExtractionOptions = {}): string {\n const { contentType = 'text', excludeThreadHistory = false } = options;\n if (!payload) return '';\n\n // If there's a direct body with data\n if (payload.body?.data) {\n return Buffer.from(payload.body.data, 'base64').toString('utf-8');\n }\n\n // If there are parts, look for text/plain or text/html\n if (payload.parts && Array.isArray(payload.parts)) {\n for (const part of payload.parts) {\n if (part.mimeType === 'text/plain' && part.body?.data) {\n return Buffer.from(part.body.data, 'base64').toString('utf-8');\n }\n if (part.mimeType === 'text/html' && part.body?.data) {\n let html = Buffer.from(part.body.data, 'base64').toString('utf-8');\n\n // Remove thread history if requested\n if (excludeThreadHistory) {\n html = extractCurrentMessageFromHtml(html);\n }\n\n // Return HTML directly if requested\n if (contentType === 'html') {\n return html;\n }\n\n // Otherwise extract plain text from HTML\n const doc = parse(html);\n const docUnknown = doc as unknown;\n if (docUnknown && typeof docUnknown === 'object' && 'text' in docUnknown) {\n return docUnknown.text as string;\n }\n return '';\n }\n }\n }\n\n return '';\n}\n"],"names":["extractBodyFromPayload","payload","options","contentType","excludeThreadHistory","body","data","Buffer","from","toString","parts","Array","isArray","part","mimeType","html","extractCurrentMessageFromHtml","doc","parse","docUnknown","text"],"mappings":";;;;+BAWgBA;;;eAAAA;;;qBAX8B;8BAExB;;;;;AASf,SAASA,uBAAuBC,OAAoC;QAAEC,UAAAA,iEAAiC,CAAC;QAKzGD;IAJJ,2BAA+DC,QAAvDC,aAAAA,gDAAc,+DAAyCD,QAAjCE,sBAAAA,kEAAuB;IACrD,IAAI,CAACH,SAAS,OAAO;IAErB,qCAAqC;IACrC,KAAIA,gBAAAA,QAAQI,IAAI,cAAZJ,oCAAAA,cAAcK,IAAI,EAAE;QACtB,OAAOC,OAAOC,IAAI,CAACP,QAAQI,IAAI,CAACC,IAAI,EAAE,UAAUG,QAAQ,CAAC;IAC3D;IAEA,uDAAuD;IACvD,IAAIR,QAAQS,KAAK,IAAIC,MAAMC,OAAO,CAACX,QAAQS,KAAK,GAAG;YAC5C,kCAAA,2BAAA;;YAAL,QAAK,YAAcT,QAAQS,KAAK,qBAA3B,SAAA,6BAAA,QAAA,yBAAA,iCAA6B;gBAA7B,IAAMG,OAAN;oBACmCA,YAGDA;gBAHrC,IAAIA,KAAKC,QAAQ,KAAK,kBAAgBD,aAAAA,KAAKR,IAAI,cAATQ,iCAAAA,WAAWP,IAAI,GAAE;oBACrD,OAAOC,OAAOC,IAAI,CAACK,KAAKR,IAAI,CAACC,IAAI,EAAE,UAAUG,QAAQ,CAAC;gBACxD;gBACA,IAAII,KAAKC,QAAQ,KAAK,iBAAeD,cAAAA,KAAKR,IAAI,cAATQ,kCAAAA,YAAWP,IAAI,GAAE;oBACpD,IAAIS,OAAOR,OAAOC,IAAI,CAACK,KAAKR,IAAI,CAACC,IAAI,EAAE,UAAUG,QAAQ,CAAC;oBAE1D,qCAAqC;oBACrC,IAAIL,sBAAsB;wBACxBW,OAAOC,IAAAA,oCAA6B,EAACD;oBACvC;oBAEA,oCAAoC;oBACpC,IAAIZ,gBAAgB,QAAQ;wBAC1B,OAAOY;oBACT;oBAEA,yCAAyC;oBACzC,IAAME,MAAMC,IAAAA,qBAAK,EAACH;oBAClB,IAAMI,aAAaF;oBACnB,IAAIE,cAAc,CAAA,OAAOA,2CAAP,SAAOA,WAAS,MAAM,YAAY,UAAUA,YAAY;wBACxE,OAAOA,WAAWC,IAAI;oBACxB;oBACA,OAAO;gBACT;YACF;;YAzBK;YAAA;;;qBAAA,6BAAA;oBAAA;;;oBAAA;0BAAA;;;;IA0BP;IAEA,OAAO;AACT"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/parsing/html-processing.ts"],"sourcesContent":["import { extractCurrentMessageFromHtml } from '@mcp-z/email';\nimport type { gmail_v1 } from 'googleapis';\nimport { parse } from 'node-html-parser';\n\nexport interface BodyExtractionOptions {\n /** Format to return: 'text' extracts plain text, 'html' preserves HTML structure */\n contentType?: 'text' | 'html';\n /** When true, removes quoted thread history from HTML content */\n excludeThreadHistory?: boolean;\n}\n\nexport function extractBodyFromPayload(payload: gmail_v1.Schema$MessagePart, options: BodyExtractionOptions = {}): string {\n const { contentType = 'text', excludeThreadHistory = false } = options;\n if (!payload) return '';\n\n // If there's a direct body with data\n if (payload.body?.data) {\n return Buffer.from(payload.body.data, 'base64').toString('utf-8');\n }\n\n // If there are parts, look for text/plain or text/html\n if (payload.parts && Array.isArray(payload.parts)) {\n for (const part of payload.parts) {\n if (part.mimeType === 'text/plain' && part.body?.data) {\n return Buffer.from(part.body.data, 'base64').toString('utf-8');\n }\n if (part.mimeType === 'text/html' && part.body?.data) {\n let html = Buffer.from(part.body.data, 'base64').toString('utf-8');\n\n // Remove thread history if requested\n if (excludeThreadHistory) {\n html = extractCurrentMessageFromHtml(html);\n }\n\n // Return HTML directly if requested\n if (contentType === 'html') {\n return html;\n }\n\n // Otherwise extract plain text from HTML\n const doc = parse(html);\n const docUnknown = doc as unknown;\n if (docUnknown && typeof docUnknown === 'object' && 'text' in docUnknown) {\n return docUnknown.text as string;\n }\n return '';\n }\n }\n }\n\n return '';\n}\n"],"names":["extractBodyFromPayload","payload","options","contentType","excludeThreadHistory","body","data","Buffer","from","toString","parts","Array","isArray","part","mimeType","html","extractCurrentMessageFromHtml","doc","parse","docUnknown","text"],"mappings":";;;;+BAWgBA;;;eAAAA;;;qBAX8B;8BAExB;;;;;AASf,SAASA,uBAAuBC,OAAoC;QAAEC,UAAAA,iEAAiC,CAAC;QAKzGD;IAJJ,2BAA+DC,QAAvDC,aAAAA,gDAAc,+DAAyCD,QAAjCE,sBAAAA,kEAAuB;IACrD,IAAI,CAACH,SAAS,OAAO;IAErB,qCAAqC;IACrC,KAAIA,gBAAAA,QAAQI,IAAI,cAAZJ,oCAAAA,cAAcK,IAAI,EAAE;QACtB,OAAOC,OAAOC,IAAI,CAACP,QAAQI,IAAI,CAACC,IAAI,EAAE,UAAUG,QAAQ,CAAC;IAC3D;IAEA,uDAAuD;IACvD,IAAIR,QAAQS,KAAK,IAAIC,MAAMC,OAAO,CAACX,QAAQS,KAAK,GAAG;YAC5C,kCAAA,2BAAA;;YAAL,QAAK,YAAcT,QAAQS,KAAK,qBAA3B,SAAA,6BAAA,QAAA,yBAAA,iCAA6B;gBAA7B,IAAMG,OAAN;oBACmCA,YAGDA;gBAHrC,IAAIA,KAAKC,QAAQ,KAAK,kBAAgBD,aAAAA,KAAKR,IAAI,cAATQ,iCAAAA,WAAWP,IAAI,GAAE;oBACrD,OAAOC,OAAOC,IAAI,CAACK,KAAKR,IAAI,CAACC,IAAI,EAAE,UAAUG,QAAQ,CAAC;gBACxD;gBACA,IAAII,KAAKC,QAAQ,KAAK,iBAAeD,cAAAA,KAAKR,IAAI,cAATQ,kCAAAA,YAAWP,IAAI,GAAE;oBACpD,IAAIS,OAAOR,OAAOC,IAAI,CAACK,KAAKR,IAAI,CAACC,IAAI,EAAE,UAAUG,QAAQ,CAAC;oBAE1D,qCAAqC;oBACrC,IAAIL,sBAAsB;wBACxBW,OAAOC,IAAAA,oCAA6B,EAACD;oBACvC;oBAEA,oCAAoC;oBACpC,IAAIZ,gBAAgB,QAAQ;wBAC1B,OAAOY;oBACT;oBAEA,yCAAyC;oBACzC,IAAME,MAAMC,IAAAA,qBAAK,EAACH;oBAClB,IAAMI,aAAaF;oBACnB,IAAIE,cAAc,CAAA,OAAOA,2CAAP,SAAOA,WAAS,MAAM,YAAY,UAAUA,YAAY;wBACxE,OAAOA,WAAWC,IAAI;oBACxB;oBACA,OAAO;gBACT;YACF;;YAzBK;YAAA;;;qBAAA,6BAAA;oBAAA;;;oBAAA;0BAAA;;;;IA0BP;IAEA,OAAO;AACT"}
@@ -11,15 +11,15 @@ function _export(target, all) {
11
11
  }
12
12
  _export(exports, {
13
13
  get extractBodyFromPayload () {
14
- return _htmlprocessing.extractBodyFromPayload;
14
+ return _htmlprocessingts.extractBodyFromPayload;
15
15
  },
16
16
  get extractEmails () {
17
- return _headersutils.extractEmails;
17
+ return _headersutilsts.extractEmails;
18
18
  },
19
19
  get extractFrom () {
20
- return _headersutils.extractFrom;
20
+ return _headersutilsts.extractFrom;
21
21
  }
22
22
  });
23
- var _headersutils = require("./headers-utils.js");
24
- var _htmlprocessing = require("./html-processing.js");
23
+ var _headersutilsts = require("./headers-utils.js");
24
+ var _htmlprocessingts = require("./html-processing.js");
25
25
  /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/parsing/message-extraction.ts"],"sourcesContent":["// Unified message extraction functionality\n\nexport { extractEmails, extractFrom } from './headers-utils.js';\nexport { extractBodyFromPayload } from './html-processing.js';\n"],"names":["extractBodyFromPayload","extractEmails","extractFrom"],"mappings":"AAAA,2CAA2C;;;;;;;;;;;;QAGlCA;eAAAA,sCAAsB;;QADtBC;eAAAA,2BAAa;;QAAEC;eAAAA,yBAAW;;;4BAAQ;8BACJ"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/parsing/message-extraction.ts"],"sourcesContent":["// Unified message extraction functionality\n\nexport { extractEmails, extractFrom } from './headers-utils.ts';\nexport { extractBodyFromPayload } from './html-processing.ts';\n"],"names":["extractBodyFromPayload","extractEmails","extractFrom"],"mappings":"AAAA,2CAA2C;;;;;;;;;;;;QAGlCA;eAAAA,wCAAsB;;QADtBC;eAAAA,6BAAa;;QAAEC;eAAAA,2BAAW;;;8BAAQ;gCACJ"}
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "executeQuery", {
9
9
  }
10
10
  });
11
11
  var _constantsts = require("../../constants.js");
12
- var _searchexecution = require("./search-execution.js");
12
+ var _searchexecutionts = require("./search-execution.js");
13
13
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
14
14
  try {
15
15
  var info = gen[key](arg);
@@ -223,7 +223,7 @@ function executeQuery(query, options, transform) {
223
223
  ]);
224
224
  return [
225
225
  4,
226
- (0, _searchexecution.searchMessages)(client, _object_spread_props(_object_spread({}, query !== undefined && {
226
+ (0, _searchexecutionts.searchMessages)(client, _object_spread_props(_object_spread({}, query !== undefined && {
227
227
  query: query
228
228
  }), {
229
229
  pageSize: pageSize !== null && pageSize !== void 0 ? pageSize : 50,
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/querying/execute-query.ts"],"sourcesContent":["import type { ExecutionResult } from '@mcp-z/email';\nimport type { gmail_v1 } from 'googleapis';\nimport { MAX_PAGE_SIZE } from '../../constants.ts';\nimport type { GmailQuery as QueryNode } from '../../schemas/gmail-query-schema.js';\nimport type { Logger } from '../../types.js';\nimport { searchMessages } from './search-execution.js';\n\nexport interface ExecuteQueryOptions {\n client: gmail_v1.Gmail;\n logger: Logger;\n pageSize?: number;\n pageToken?: string;\n includeBody?: boolean;\n}\n\n/**\n * Execute a Gmail query with direct, single-attempt execution.\n * No planning, no fallbacks, no retries.\n * Provider errors are returned directly to the caller for actionable feedback.\n */\nexport async function executeQuery<T>(query: QueryNode | undefined, options: ExecuteQueryOptions, transform: (item: unknown) => T): Promise<ExecutionResult<T>> {\n const { client, logger, pageSize, pageToken, includeBody } = options;\n\n // Validate pagination parameters\n if (pageSize !== undefined && (pageSize < 1 || pageSize > MAX_PAGE_SIZE)) {\n throw new Error(`pageSize must be between 1 and ${MAX_PAGE_SIZE}`);\n }\n\n if (pageToken !== undefined && typeof pageToken === 'string' && pageToken.trim().length === 0) {\n logger.info('Empty pageToken provided, ignoring');\n }\n\n // Single execution - direct query to Gmail API\n logger.info('executeQuery: executing direct Gmail query');\n\n try {\n const result = await searchMessages(client, {\n ...(query !== undefined && { query }),\n pageSize: pageSize ?? 50,\n pageToken: pageToken && pageToken.trim().length > 0 ? pageToken : undefined,\n includeBody: includeBody ?? false,\n logger,\n });\n\n // Transform results\n const transformedResults = result.messages.map(transform);\n\n logger.info(`executeQuery: succeeded with ${transformedResults.length} results`);\n\n return {\n success: true,\n items: transformedResults,\n metadata: {\n nextPageToken: result.nextPageToken,\n },\n };\n } catch (error) {\n // Re-throw errors directly - no fallback logic\n logger.error('executeQuery: failed', { error: error instanceof Error ? error.message : String(error) });\n throw error;\n }\n}\n"],"names":["executeQuery","query","options","transform","client","logger","pageSize","pageToken","includeBody","result","transformedResults","error","undefined","MAX_PAGE_SIZE","Error","trim","length","info","searchMessages","messages","map","success","items","metadata","nextPageToken","message","String"],"mappings":";;;;+BAoBsBA;;;eAAAA;;;2BAlBQ;+BAGC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAexB,SAAeA,aAAgBC,KAA4B,EAAEC,OAA4B,EAAEC,SAA+B;;YACvHC,QAAQC,QAAQC,UAAUC,WAAWC,aAerCC,QASAC,oBAWCC;;;;oBAnCDP,SAAqDF,QAArDE,QAAQC,SAA6CH,QAA7CG,QAAQC,WAAqCJ,QAArCI,UAAUC,YAA2BL,QAA3BK,WAAWC,cAAgBN,QAAhBM;oBAE7C,iCAAiC;oBACjC,IAAIF,aAAaM,aAAcN,CAAAA,WAAW,KAAKA,WAAWO,0BAAa,AAAD,GAAI;wBACxE,MAAM,IAAIC,MAAM,AAAC,kCAA+C,OAAdD,0BAAa;oBACjE;oBAEA,IAAIN,cAAcK,aAAa,OAAOL,cAAc,YAAYA,UAAUQ,IAAI,GAAGC,MAAM,KAAK,GAAG;wBAC7FX,OAAOY,IAAI,CAAC;oBACd;oBAEA,+CAA+C;oBAC/CZ,OAAOY,IAAI,CAAC;;;;;;;;;oBAGK;;wBAAMC,IAAAA,+BAAc,EAACd,QAAQ,wCACtCH,UAAUW,aAAa;4BAAEX,OAAAA;wBAAM;4BACnCK,QAAQ,EAAEA,qBAAAA,sBAAAA,WAAY;4BACtBC,WAAWA,aAAaA,UAAUQ,IAAI,GAAGC,MAAM,GAAG,IAAIT,YAAYK;4BAClEJ,WAAW,EAAEA,wBAAAA,yBAAAA,cAAe;4BAC5BH,QAAAA;;;;oBALII,SAAS;oBAQf,oBAAoB;oBACdC,qBAAqBD,OAAOU,QAAQ,CAACC,GAAG,CAACjB;oBAE/CE,OAAOY,IAAI,CAAC,AAAC,gCAAyD,OAA1BP,mBAAmBM,MAAM,EAAC;oBAEtE;;wBAAO;4BACLK,SAAS;4BACTC,OAAOZ;4BACPa,UAAU;gCACRC,eAAef,OAAOe,aAAa;4BACrC;wBACF;;;oBACOb;oBACP,+CAA+C;oBAC/CN,OAAOM,KAAK,CAAC,wBAAwB;wBAAEA,OAAOA,AAAK,YAALA,OAAiBG,SAAQH,MAAMc,OAAO,GAAGC,OAAOf;oBAAO;oBACrG,MAAMA;;;;;;;IAEV"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/querying/execute-query.ts"],"sourcesContent":["import type { ExecutionResult } from '@mcp-z/email';\nimport type { gmail_v1 } from 'googleapis';\nimport { MAX_PAGE_SIZE } from '../../constants.ts';\nimport type { GmailQuery as QueryNode } from '../../schemas/gmail-query-schema.ts';\nimport type { Logger } from '../../types.ts';\nimport { searchMessages } from './search-execution.ts';\n\nexport interface ExecuteQueryOptions {\n client: gmail_v1.Gmail;\n logger: Logger;\n pageSize?: number;\n pageToken?: string;\n includeBody?: boolean;\n}\n\n/**\n * Execute a Gmail query with direct, single-attempt execution.\n * No planning, no fallbacks, no retries.\n * Provider errors are returned directly to the caller for actionable feedback.\n */\nexport async function executeQuery<T>(query: QueryNode | undefined, options: ExecuteQueryOptions, transform: (item: unknown) => T): Promise<ExecutionResult<T>> {\n const { client, logger, pageSize, pageToken, includeBody } = options;\n\n // Validate pagination parameters\n if (pageSize !== undefined && (pageSize < 1 || pageSize > MAX_PAGE_SIZE)) {\n throw new Error(`pageSize must be between 1 and ${MAX_PAGE_SIZE}`);\n }\n\n if (pageToken !== undefined && typeof pageToken === 'string' && pageToken.trim().length === 0) {\n logger.info('Empty pageToken provided, ignoring');\n }\n\n // Single execution - direct query to Gmail API\n logger.info('executeQuery: executing direct Gmail query');\n\n try {\n const result = await searchMessages(client, {\n ...(query !== undefined && { query }),\n pageSize: pageSize ?? 50,\n pageToken: pageToken && pageToken.trim().length > 0 ? pageToken : undefined,\n includeBody: includeBody ?? false,\n logger,\n });\n\n // Transform results\n const transformedResults = result.messages.map(transform);\n\n logger.info(`executeQuery: succeeded with ${transformedResults.length} results`);\n\n return {\n success: true,\n items: transformedResults,\n metadata: {\n nextPageToken: result.nextPageToken,\n },\n };\n } catch (error) {\n // Re-throw errors directly - no fallback logic\n logger.error('executeQuery: failed', { error: error instanceof Error ? error.message : String(error) });\n throw error;\n }\n}\n"],"names":["executeQuery","query","options","transform","client","logger","pageSize","pageToken","includeBody","result","transformedResults","error","undefined","MAX_PAGE_SIZE","Error","trim","length","info","searchMessages","messages","map","success","items","metadata","nextPageToken","message","String"],"mappings":";;;;+BAoBsBA;;;eAAAA;;;2BAlBQ;iCAGC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAexB,SAAeA,aAAgBC,KAA4B,EAAEC,OAA4B,EAAEC,SAA+B;;YACvHC,QAAQC,QAAQC,UAAUC,WAAWC,aAerCC,QASAC,oBAWCC;;;;oBAnCDP,SAAqDF,QAArDE,QAAQC,SAA6CH,QAA7CG,QAAQC,WAAqCJ,QAArCI,UAAUC,YAA2BL,QAA3BK,WAAWC,cAAgBN,QAAhBM;oBAE7C,iCAAiC;oBACjC,IAAIF,aAAaM,aAAcN,CAAAA,WAAW,KAAKA,WAAWO,0BAAa,AAAD,GAAI;wBACxE,MAAM,IAAIC,MAAM,AAAC,kCAA+C,OAAdD,0BAAa;oBACjE;oBAEA,IAAIN,cAAcK,aAAa,OAAOL,cAAc,YAAYA,UAAUQ,IAAI,GAAGC,MAAM,KAAK,GAAG;wBAC7FX,OAAOY,IAAI,CAAC;oBACd;oBAEA,+CAA+C;oBAC/CZ,OAAOY,IAAI,CAAC;;;;;;;;;oBAGK;;wBAAMC,IAAAA,iCAAc,EAACd,QAAQ,wCACtCH,UAAUW,aAAa;4BAAEX,OAAAA;wBAAM;4BACnCK,QAAQ,EAAEA,qBAAAA,sBAAAA,WAAY;4BACtBC,WAAWA,aAAaA,UAAUQ,IAAI,GAAGC,MAAM,GAAG,IAAIT,YAAYK;4BAClEJ,WAAW,EAAEA,wBAAAA,yBAAAA,cAAe;4BAC5BH,QAAAA;;;;oBALII,SAAS;oBAQf,oBAAoB;oBACdC,qBAAqBD,OAAOU,QAAQ,CAACC,GAAG,CAACjB;oBAE/CE,OAAOY,IAAI,CAAC,AAAC,gCAAyD,OAA1BP,mBAAmBM,MAAM,EAAC;oBAEtE;;wBAAO;4BACLK,SAAS;4BACTC,OAAOZ;4BACPa,UAAU;gCACRC,eAAef,OAAOe,aAAa;4BACrC;wBACF;;;oBACOb;oBACP,+CAA+C;oBAC/CN,OAAOM,KAAK,CAAC,wBAAwB;wBAAEA,OAAOA,AAAK,YAALA,OAAiBG,SAAQH,MAAMc,OAAO,GAAGC,OAAOf;oBAAO;oBACrG,MAAMA;;;;;;;IAEV"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/querying/pagination.ts"],"sourcesContent":["/** Gmail pagination helpers for single-page operations. */\n\nimport type { gmail_v1 } from 'googleapis';\nimport type { Logger } from '../../types.js';\n\nexport interface SinglePageResult {\n readonly messages: gmail_v1.Schema$Message[];\n readonly nextPageToken: string | undefined;\n}\n\n/**\n * Fetch a single page of messages from Gmail\n */\nexport interface FetchMessagesPageParams {\n readonly gmailQ: string;\n readonly pageSize?: number;\n readonly pageToken: string | undefined;\n readonly body?: boolean;\n readonly logger: Logger;\n readonly metadataHeaders?: readonly string[];\n}\n\nexport async function fetchMessagesPage(gmail: gmail_v1.Gmail, params: FetchMessagesPageParams): Promise<SinglePageResult> {\n const { gmailQ, pageSize = 50, pageToken, body = false, logger, metadataHeaders } = params;\n\n // Secure resource bounds checking - prevent security bypasses\n const maxPageSize = 500; // Gmail API maximum - enforced for security\n const minPageSize = 1; // Minimum valid page size\n\n // Validate input is a positive number to prevent bypass attempts\n if (!Number.isInteger(pageSize) || pageSize < 0) {\n throw new Error(`Invalid pageSize: must be a positive integer, got ${pageSize}`);\n }\n\n const safePageSize = Math.min(Math.max(minPageSize, pageSize), maxPageSize);\n\n if (pageSize !== safePageSize && logger) {\n logger.info('Page size bounded for API safety', { requested: pageSize, applied: safePageSize });\n // No fallback to console - would corrupt MCP stdio communication\n }\n\n try {\n const listParams = {\n userId: 'me',\n q: gmailQ,\n maxResults: safePageSize,\n };\n const listResponse = pageToken && pageToken.trim().length > 0 ? await gmail.users.messages.list({ ...listParams, pageToken }) : await gmail.users.messages.list(listParams);\n const response = listResponse.data;\n const messages = response.messages || [];\n\n if (messages.length === 0) {\n if (logger) logger.info('No messages found on page');\n return { messages: [], nextPageToken: undefined };\n }\n\n const items = messages.map((m: gmail_v1.Schema$Message) => m.id).filter(Boolean) as string[];\n if (items.length === 0) {\n if (logger) logger.info('No valid message ids on page');\n return { messages: [], nextPageToken: response.nextPageToken && response.nextPageToken.trim().length > 0 ? response.nextPageToken : undefined };\n }\n\n const concurrentArgs: FetchMessagesConcurrentlyParams = {\n items,\n concurrency: 5,\n body,\n ...(logger && { logger }),\n ...(metadataHeaders && { metadataHeaders }),\n };\n const detailedMessages = await fetchMessagesConcurrently(gmail, concurrentArgs);\n\n if (logger) logger.info(`Fetched page with ${detailedMessages.length} messages`);\n return {\n messages: detailedMessages,\n nextPageToken: response.nextPageToken && response.nextPageToken.trim().length > 0 ? response.nextPageToken : undefined,\n };\n } catch (error) {\n // Standardized error handling for pagination pipeline\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (logger)\n logger.error('Gmail pagination: single page fetch failed', {\n error: errorMessage,\n query: gmailQ,\n pageSize: safePageSize,\n hasPageToken: !!pageToken,\n });\n\n // Preserve original error type for upstream handling\n if (error instanceof Error) {\n // Enhance error with pagination context\n error.message = `Gmail pagination fetch failed: ${error.message}`;\n throw error;\n }\n\n // Convert non-Error objects to proper Error instances\n throw new Error(`Gmail pagination fetch failed: ${errorMessage}`);\n }\n}\n\nexport interface FetchMessagesConcurrentlyParams {\n readonly items: readonly string[];\n readonly concurrency?: number;\n readonly body?: boolean;\n readonly logger: Logger;\n readonly metadataHeaders?: readonly string[];\n}\n\nexport async function fetchMessagesConcurrently(gmail: gmail_v1.Gmail, params: FetchMessagesConcurrentlyParams): Promise<gmail_v1.Schema$Message[]> {\n const { items, concurrency = 2, body = false, logger, metadataHeaders } = params;\n\n // Secure resource bounds checking for concurrent operations\n const maxConcurrency = 10; // Conservative limit to prevent rate limiting and resource exhaustion\n const minConcurrency = 1; // Minimum valid concurrency\n\n // Validate input is a positive number to prevent bypass attempts\n if (!Number.isInteger(concurrency) || concurrency < 0) {\n throw new Error(`Invalid concurrency: must be a positive integer, got ${concurrency}`);\n }\n\n const safeConcurrency = Math.min(Math.max(minConcurrency, concurrency), maxConcurrency);\n\n if (concurrency !== safeConcurrency && logger) {\n logger.info('Concurrency bounded for API safety', { requested: concurrency, applied: safeConcurrency });\n // No fallback to console - would corrupt MCP stdio communication\n }\n\n if (items.length === 0) return [];\n\n const results: (gmail_v1.Schema$Message | null)[] = new Array(items.length);\n const format = body ? 'full' : 'metadata';\n // Always pass metadataHeaders if provided - body doesn't replace headers, it's additional content\n const metadataHeadersForRequest = metadataHeaders;\n\n // Pre-build request parameters to avoid repeated object creation\n const requestParams = items.map((id) => {\n const baseParams = {\n userId: 'me' as const,\n id,\n format,\n };\n // Only include metadataHeaders if defined (exactOptionalPropertyTypes compliance)\n return metadataHeadersForRequest ? { ...baseParams, metadataHeaders: [...metadataHeadersForRequest] } : baseParams;\n });\n\n // Optimize concurrent processing using batching\n const batchSize = safeConcurrency;\n const batches: (typeof requestParams)[] = [];\n for (let i = 0; i < requestParams.length; i += batchSize) {\n batches.push(requestParams.slice(i, i + batchSize));\n }\n\n let processedCount = 0;\n for (const batch of batches) {\n const batchPromises = batch.map(async (params, batchIndex) => {\n try {\n const messageResponse = await gmail.users.messages.get(params);\n const globalIndex = processedCount + batchIndex;\n results[globalIndex] = messageResponse.data;\n return messageResponse.data;\n } catch (error) {\n // Log individual message fetch failures but continue processing\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (logger)\n logger.info('Gmail pagination: individual message fetch failed, continuing', {\n error: errorMessage,\n messageId: params.id,\n globalIndex: processedCount + batchIndex,\n });\n return null; // Mark as failed but continue\n }\n });\n\n await Promise.all(batchPromises);\n processedCount += batch.length;\n\n // Progress logging for large batches\n if (items.length > 20) {\n if (logger) logger.info(`Gmail pagination: processed ${processedCount}/${items.length} messages`);\n }\n }\n\n // Filter out any null results from failed individual fetches\n return results.filter((result) => result !== null && result !== undefined);\n}\n"],"names":["fetchMessagesConcurrently","fetchMessagesPage","gmail","params","gmailQ","pageSize","pageToken","body","logger","metadataHeaders","maxPageSize","minPageSize","safePageSize","listParams","listResponse","response","messages","items","concurrentArgs","detailedMessages","error","errorMessage","Number","isInteger","Error","Math","min","max","info","requested","applied","userId","q","maxResults","trim","length","users","list","data","nextPageToken","undefined","map","m","id","filter","Boolean","concurrency","message","String","query","hasPageToken","maxConcurrency","minConcurrency","safeConcurrency","results","format","metadataHeadersForRequest","requestParams","batchSize","batches","i","processedCount","batch","batchPromises","Array","baseParams","push","slice","batchIndex","messageResponse","globalIndex","get","messageId","Promise","all","result"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/querying/pagination.ts"],"sourcesContent":["/** Gmail pagination helpers for single-page operations. */\n\nimport type { gmail_v1 } from 'googleapis';\nimport type { Logger } from '../../types.ts';\n\nexport interface SinglePageResult {\n readonly messages: gmail_v1.Schema$Message[];\n readonly nextPageToken: string | undefined;\n}\n\n/**\n * Fetch a single page of messages from Gmail\n */\nexport interface FetchMessagesPageParams {\n readonly gmailQ: string;\n readonly pageSize?: number;\n readonly pageToken: string | undefined;\n readonly body?: boolean;\n readonly logger: Logger;\n readonly metadataHeaders?: readonly string[];\n}\n\nexport async function fetchMessagesPage(gmail: gmail_v1.Gmail, params: FetchMessagesPageParams): Promise<SinglePageResult> {\n const { gmailQ, pageSize = 50, pageToken, body = false, logger, metadataHeaders } = params;\n\n // Secure resource bounds checking - prevent security bypasses\n const maxPageSize = 500; // Gmail API maximum - enforced for security\n const minPageSize = 1; // Minimum valid page size\n\n // Validate input is a positive number to prevent bypass attempts\n if (!Number.isInteger(pageSize) || pageSize < 0) {\n throw new Error(`Invalid pageSize: must be a positive integer, got ${pageSize}`);\n }\n\n const safePageSize = Math.min(Math.max(minPageSize, pageSize), maxPageSize);\n\n if (pageSize !== safePageSize && logger) {\n logger.info('Page size bounded for API safety', { requested: pageSize, applied: safePageSize });\n // No fallback to console - would corrupt MCP stdio communication\n }\n\n try {\n const listParams = {\n userId: 'me',\n q: gmailQ,\n maxResults: safePageSize,\n };\n const listResponse = pageToken && pageToken.trim().length > 0 ? await gmail.users.messages.list({ ...listParams, pageToken }) : await gmail.users.messages.list(listParams);\n const response = listResponse.data;\n const messages = response.messages || [];\n\n if (messages.length === 0) {\n if (logger) logger.info('No messages found on page');\n return { messages: [], nextPageToken: undefined };\n }\n\n const items = messages.map((m: gmail_v1.Schema$Message) => m.id).filter(Boolean) as string[];\n if (items.length === 0) {\n if (logger) logger.info('No valid message ids on page');\n return { messages: [], nextPageToken: response.nextPageToken && response.nextPageToken.trim().length > 0 ? response.nextPageToken : undefined };\n }\n\n const concurrentArgs: FetchMessagesConcurrentlyParams = {\n items,\n concurrency: 5,\n body,\n ...(logger && { logger }),\n ...(metadataHeaders && { metadataHeaders }),\n };\n const detailedMessages = await fetchMessagesConcurrently(gmail, concurrentArgs);\n\n if (logger) logger.info(`Fetched page with ${detailedMessages.length} messages`);\n return {\n messages: detailedMessages,\n nextPageToken: response.nextPageToken && response.nextPageToken.trim().length > 0 ? response.nextPageToken : undefined,\n };\n } catch (error) {\n // Standardized error handling for pagination pipeline\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (logger)\n logger.error('Gmail pagination: single page fetch failed', {\n error: errorMessage,\n query: gmailQ,\n pageSize: safePageSize,\n hasPageToken: !!pageToken,\n });\n\n // Preserve original error type for upstream handling\n if (error instanceof Error) {\n // Enhance error with pagination context\n error.message = `Gmail pagination fetch failed: ${error.message}`;\n throw error;\n }\n\n // Convert non-Error objects to proper Error instances\n throw new Error(`Gmail pagination fetch failed: ${errorMessage}`);\n }\n}\n\nexport interface FetchMessagesConcurrentlyParams {\n readonly items: readonly string[];\n readonly concurrency?: number;\n readonly body?: boolean;\n readonly logger: Logger;\n readonly metadataHeaders?: readonly string[];\n}\n\nexport async function fetchMessagesConcurrently(gmail: gmail_v1.Gmail, params: FetchMessagesConcurrentlyParams): Promise<gmail_v1.Schema$Message[]> {\n const { items, concurrency = 2, body = false, logger, metadataHeaders } = params;\n\n // Secure resource bounds checking for concurrent operations\n const maxConcurrency = 10; // Conservative limit to prevent rate limiting and resource exhaustion\n const minConcurrency = 1; // Minimum valid concurrency\n\n // Validate input is a positive number to prevent bypass attempts\n if (!Number.isInteger(concurrency) || concurrency < 0) {\n throw new Error(`Invalid concurrency: must be a positive integer, got ${concurrency}`);\n }\n\n const safeConcurrency = Math.min(Math.max(minConcurrency, concurrency), maxConcurrency);\n\n if (concurrency !== safeConcurrency && logger) {\n logger.info('Concurrency bounded for API safety', { requested: concurrency, applied: safeConcurrency });\n // No fallback to console - would corrupt MCP stdio communication\n }\n\n if (items.length === 0) return [];\n\n const results: (gmail_v1.Schema$Message | null)[] = new Array(items.length);\n const format = body ? 'full' : 'metadata';\n // Always pass metadataHeaders if provided - body doesn't replace headers, it's additional content\n const metadataHeadersForRequest = metadataHeaders;\n\n // Pre-build request parameters to avoid repeated object creation\n const requestParams = items.map((id) => {\n const baseParams = {\n userId: 'me' as const,\n id,\n format,\n };\n // Only include metadataHeaders if defined (exactOptionalPropertyTypes compliance)\n return metadataHeadersForRequest ? { ...baseParams, metadataHeaders: [...metadataHeadersForRequest] } : baseParams;\n });\n\n // Optimize concurrent processing using batching\n const batchSize = safeConcurrency;\n const batches: (typeof requestParams)[] = [];\n for (let i = 0; i < requestParams.length; i += batchSize) {\n batches.push(requestParams.slice(i, i + batchSize));\n }\n\n let processedCount = 0;\n for (const batch of batches) {\n const batchPromises = batch.map(async (params, batchIndex) => {\n try {\n const messageResponse = await gmail.users.messages.get(params);\n const globalIndex = processedCount + batchIndex;\n results[globalIndex] = messageResponse.data;\n return messageResponse.data;\n } catch (error) {\n // Log individual message fetch failures but continue processing\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (logger)\n logger.info('Gmail pagination: individual message fetch failed, continuing', {\n error: errorMessage,\n messageId: params.id,\n globalIndex: processedCount + batchIndex,\n });\n return null; // Mark as failed but continue\n }\n });\n\n await Promise.all(batchPromises);\n processedCount += batch.length;\n\n // Progress logging for large batches\n if (items.length > 20) {\n if (logger) logger.info(`Gmail pagination: processed ${processedCount}/${items.length} messages`);\n }\n }\n\n // Filter out any null results from failed individual fetches\n return results.filter((result) => result !== null && result !== undefined);\n}\n"],"names":["fetchMessagesConcurrently","fetchMessagesPage","gmail","params","gmailQ","pageSize","pageToken","body","logger","metadataHeaders","maxPageSize","minPageSize","safePageSize","listParams","listResponse","response","messages","items","concurrentArgs","detailedMessages","error","errorMessage","Number","isInteger","Error","Math","min","max","info","requested","applied","userId","q","maxResults","trim","length","users","list","data","nextPageToken","undefined","map","m","id","filter","Boolean","concurrency","message","String","query","hasPageToken","maxConcurrency","minConcurrency","safeConcurrency","results","format","metadataHeadersForRequest","requestParams","batchSize","batches","i","processedCount","batch","batchPromises","Array","baseParams","push","slice","batchIndex","messageResponse","globalIndex","get","messageId","Promise","all","result"],"mappings":"AAAA,yDAAyD;;;;;;;;;;;QA2GnCA;eAAAA;;QArFAC;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAf,SAAeA,kBAAkBC,KAAqB,EAAEC,MAA+B;;YACpFC,0BAAQC,UAAeC,yBAAWC,MAAcC,QAAQC,iBAG1DC,aACAC,aAOAC,cAQEC,YAKAC,oBACAC,UACAC,UAOAC,OAMAC,gBAOAC,kBAOCC,OAEDC;;;;oBAvDAjB,SAA4ED,OAA5EC,2BAA4ED,OAApEE,UAAAA,yCAAW,uBAAIC,YAAqDH,OAArDG,0BAAqDH,OAA1CI,MAAAA,iCAAO,sBAAOC,SAA4BL,OAA5BK,QAAQC,kBAAoBN,OAApBM;oBAEhE,8DAA8D;oBACxDC,cAAc,KAAK,4CAA4C;oBAC/DC,cAAc,GAAG,0BAA0B;oBAEjD,iEAAiE;oBACjE,IAAI,CAACW,OAAOC,SAAS,CAAClB,aAAaA,WAAW,GAAG;wBAC/C,MAAM,IAAImB,MAAM,AAAC,qDAA6D,OAATnB;oBACvE;oBAEMO,eAAea,KAAKC,GAAG,CAACD,KAAKE,GAAG,CAAChB,aAAaN,WAAWK;oBAE/D,IAAIL,aAAaO,gBAAgBJ,QAAQ;wBACvCA,OAAOoB,IAAI,CAAC,oCAAoC;4BAAEC,WAAWxB;4BAAUyB,SAASlB;wBAAa;oBAC7F,iEAAiE;oBACnE;;;;;;;;;oBAGQC,aAAa;wBACjBkB,QAAQ;wBACRC,GAAG5B;wBACH6B,YAAYrB;oBACd;yBACqBN,CAAAA,aAAaA,UAAU4B,IAAI,GAAGC,MAAM,GAAG,CAAA,GAAvC7B;;;;oBAA2C;;wBAAMJ,MAAMkC,KAAK,CAACpB,QAAQ,CAACqB,IAAI,CAAC,wCAAKxB;4BAAYP,WAAAA;;;;2BAAjD;;;;;;oBAAgE;;wBAAMJ,MAAMkC,KAAK,CAACpB,QAAQ,CAACqB,IAAI,CAACxB;;;2BAAhC;;;oBAA1HC;oBACAC,WAAWD,aAAawB,IAAI;oBAC5BtB,WAAWD,SAASC,QAAQ;oBAElC,IAAIA,SAASmB,MAAM,KAAK,GAAG;wBACzB,IAAI3B,QAAQA,OAAOoB,IAAI,CAAC;wBACxB;;4BAAO;gCAAEZ,QAAQ;gCAAMuB,eAAeC;4BAAU;;oBAClD;oBAEMvB,QAAQD,SAASyB,GAAG,CAAC,SAACC;+BAA+BA,EAAEC,EAAE;uBAAEC,MAAM,CAACC;oBACxE,IAAI5B,MAAMkB,MAAM,KAAK,GAAG;wBACtB,IAAI3B,QAAQA,OAAOoB,IAAI,CAAC;wBACxB;;4BAAO;gCAAEZ,QAAQ;gCAAMuB,eAAexB,SAASwB,aAAa,IAAIxB,SAASwB,aAAa,CAACL,IAAI,GAAGC,MAAM,GAAG,IAAIpB,SAASwB,aAAa,GAAGC;4BAAU;;oBAChJ;oBAEMtB,iBAAkD;wBACtDD,OAAAA;wBACA6B,aAAa;wBACbvC,MAAAA;uBACIC,UAAU;wBAAEA,QAAAA;oBAAO,GACnBC,mBAAmB;wBAAEA,iBAAAA;oBAAgB;oBAElB;;wBAAMT,0BAA0BE,OAAOgB;;;oBAA1DC,mBAAmB;oBAEzB,IAAIX,QAAQA,OAAOoB,IAAI,CAAC,AAAC,qBAA4C,OAAxBT,iBAAiBgB,MAAM,EAAC;oBACrE;;wBAAO;4BACLnB,UAAUG;4BACVoB,eAAexB,SAASwB,aAAa,IAAIxB,SAASwB,aAAa,CAACL,IAAI,GAAGC,MAAM,GAAG,IAAIpB,SAASwB,aAAa,GAAGC;wBAC/G;;;oBACOpB;oBACP,sDAAsD;oBAChDC,eAAeD,AAAK,YAALA,OAAiBI,SAAQJ,MAAM2B,OAAO,GAAGC,OAAO5B;oBACrE,IAAIZ,QACFA,OAAOY,KAAK,CAAC,8CAA8C;wBACzDA,OAAOC;wBACP4B,OAAO7C;wBACPC,UAAUO;wBACVsC,cAAc,CAAC,CAAC5C;oBAClB;oBAEF,qDAAqD;oBACrD,IAAIc,AAAK,YAALA,OAAiBI,QAAO;wBAC1B,wCAAwC;wBACxCJ,MAAM2B,OAAO,GAAG,AAAC,kCAA+C,OAAd3B,MAAM2B,OAAO;wBAC/D,MAAM3B;oBACR;oBAEA,sDAAsD;oBACtD,MAAM,IAAII,MAAM,AAAC,kCAA8C,OAAbH;;;;;;;IAEtD;;AAUO,SAAerB,0BAA0BE,KAAqB,EAAEC,MAAuC;;YACpGc,4BAAO6B,2BAAiBvC,MAAcC,QAAQC,iBAGhD0C,gBACAC,gBAOAC,iBASAC,SACAC,QAEAC,2BAGAC,eAWAC,WACAC,SACGC,GAILC,gBACC,2BAAA,mBAAA,gBAAA,WAAA,OAAMC,OACHC;;;;oBA7CA9C,QAAkEd,OAAlEc,6BAAkEd,OAA3D2C,aAAAA,+CAAc,wCAA6C3C,OAA1CI,MAAAA,iCAAO,sBAAOC,SAA4BL,OAA5BK,QAAQC,kBAAoBN,OAApBM;oBAEtD,4DAA4D;oBACtD0C,iBAAiB,IAAI,sEAAsE;oBAC3FC,iBAAiB,GAAG,4BAA4B;oBAEtD,iEAAiE;oBACjE,IAAI,CAAC9B,OAAOC,SAAS,CAACuB,gBAAgBA,cAAc,GAAG;wBACrD,MAAM,IAAItB,MAAM,AAAC,wDAAmE,OAAZsB;oBAC1E;oBAEMO,kBAAkB5B,KAAKC,GAAG,CAACD,KAAKE,GAAG,CAACyB,gBAAgBN,cAAcK;oBAExE,IAAIL,gBAAgBO,mBAAmB7C,QAAQ;wBAC7CA,OAAOoB,IAAI,CAAC,sCAAsC;4BAAEC,WAAWiB;4BAAahB,SAASuB;wBAAgB;oBACrG,iEAAiE;oBACnE;oBAEA,IAAIpC,MAAMkB,MAAM,KAAK,GAAG;;;;oBAElBmB,UAA8C,IAAIU,MAAM/C,MAAMkB,MAAM;oBACpEoB,SAAShD,OAAO,SAAS;oBAC/B,kGAAkG;oBAC5FiD,4BAA4B/C;oBAElC,iEAAiE;oBAC3DgD,gBAAgBxC,MAAMwB,GAAG,CAAC,SAACE;wBAC/B,IAAMsB,aAAa;4BACjBlC,QAAQ;4BACRY,IAAAA;4BACAY,QAAAA;wBACF;wBACA,kFAAkF;wBAClF,OAAOC,4BAA4B,wCAAKS;4BAAYxD,iBAAkB,qBAAG+C;6BAA+BS;oBAC1G;oBAEA,gDAAgD;oBAC1CP,YAAYL;oBACZM;oBACN,IAASC,IAAI,GAAGA,IAAIH,cAActB,MAAM,EAAEyB,KAAKF,UAAW;wBACxDC,QAAQO,IAAI,CAACT,cAAcU,KAAK,CAACP,GAAGA,IAAIF;oBAC1C;oBAEIG,iBAAiB;oBAChB,kCAAA,2BAAA;;;;;;;;;oBAAA,YAAeF;;;2BAAf,6BAAA,QAAA;;;;oBAAMG,QAAN;oBACGC,gBAAgBD,MAAMrB,GAAG,CAAC,SAAOtC,QAAQiE;;gCAErCC,iBACAC,aAGClD,OAEDC;;;;;;;;;;wCANkB;;4CAAMnB,MAAMkC,KAAK,CAACpB,QAAQ,CAACuD,GAAG,CAACpE;;;wCAAjDkE,kBAAkB;wCAClBC,cAAcT,iBAAiBO;wCACrCd,OAAO,CAACgB,YAAY,GAAGD,gBAAgB/B,IAAI;wCAC3C;;4CAAO+B,gBAAgB/B,IAAI;;;wCACpBlB;wCACP,gEAAgE;wCAC1DC,eAAeD,AAAK,YAALA,OAAiBI,SAAQJ,MAAM2B,OAAO,GAAGC,OAAO5B;wCACrE,IAAIZ,QACFA,OAAOoB,IAAI,CAAC,iEAAiE;4CAC3ER,OAAOC;4CACPmD,WAAWrE,OAAOwC,EAAE;4CACpB2B,aAAaT,iBAAiBO;wCAChC;wCACF;;4CAAO;2CAAM,8BAA8B;;;;;;;wBAE/C;;oBAEA;;wBAAMK,QAAQC,GAAG,CAACX;;;oBAAlB;oBACAF,kBAAkBC,MAAM3B,MAAM;oBAE9B,qCAAqC;oBACrC,IAAIlB,MAAMkB,MAAM,GAAG,IAAI;wBACrB,IAAI3B,QAAQA,OAAOoB,IAAI,CAAC,AAAC,+BAAgDX,OAAlB4C,gBAAe,KAAgB,OAAb5C,MAAMkB,MAAM,EAAC;oBACxF;;;oBA1BG;;;;;;;;;;;;oBAAA;oBAAA;;;;;;;6BAAA,6BAAA;4BAAA;;;4BAAA;kCAAA;;;;;;;oBA6BL,6DAA6D;oBAC7D;;wBAAOmB,QAAQV,MAAM,CAAC,SAAC+B;mCAAWA,WAAW,QAAQA,WAAWnC;;;;;IAClE"}