@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
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/setup/config.ts"],"sourcesContent":["import { parseDcrConfig, parseConfig as parseOAuthConfig } from '@mcp-z/oauth-google';\nimport { parseConfig as parseTransportConfig } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport { homedir } from 'os';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { parseArgs } from 'util';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.js';\n\nconst pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));\n\nconst HELP_TEXT = `\nUsage: mcp-gmail [options]\n\nMCP server for Gmail email management with OAuth authentication.\n\nOptions:\n --version Show version number\n --help Show this help message\n --auth=<mode> Authentication mode (default: loopback-oauth)\n Modes: loopback-oauth, service-account, dcr\n --headless Disable browser auto-open, return auth URL instead\n --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n --dcr-verify-url=<url> External verification endpoint (required for external mode)\n --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n --port=<port> Enable HTTP transport on specified port\n --stdio Enable stdio transport (default if no port)\n --log-level=<level> Logging level (default: info)\n --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)\n --base-url=<url> Base URL for HTTP file serving (optional)\n\nEnvironment Variables:\n GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n GOOGLE_CLIENT_SECRET OAuth client secret (optional)\n AUTH_MODE Default authentication mode (optional)\n HEADLESS Disable browser auto-open (optional)\n DCR_MODE DCR mode (optional, same format as --dcr-mode)\n DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n PORT Default HTTP port (optional)\n LOG_LEVEL Default logging level (optional)\n STORAGE_DIR Default storage directory (optional)\n BASE_URL Default base URL for file serving (optional)\n\nOAuth Scopes:\n openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\n\nExamples:\n mcp-gmail # Use default settings\n mcp-gmail --auth=service-account # Use service account auth\n mcp-gmail --port=3000 # HTTP transport on port 3000\n mcp-gmail --storage-dir=./emails # Custom storage directory\n GOOGLE_CLIENT_ID=xxx mcp-gmail # Set client ID via env var\n`.trim();\n\n/**\n * Handle --version and --help flags before config parsing.\n * These should work without requiring any configuration.\n */\nexport function handleVersionHelp(args: string[]): { handled: boolean; output?: string } {\n const { values } = parseArgs({\n args,\n options: {\n version: { type: 'boolean' },\n help: { type: 'boolean' },\n },\n strict: false,\n });\n\n if (values.version) return { handled: true, output: pkg.version };\n if (values.help) return { handled: true, output: HELP_TEXT };\n return { handled: false };\n}\n\n/**\n * Parse Gmail server configuration from CLI arguments and environment.\n *\n * CLI Arguments (all optional):\n * - --auth=<mode> Authentication mode (default: loopback-oauth)\n * Modes: loopback-oauth, service-account, dcr\n * - --headless Disable browser auto-open, return auth URL instead\n * - --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n * - --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n * - --dcr-verify-url=<url> External verification endpoint (required for external mode)\n * - --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n * - --port=<port> Enable HTTP transport on specified port\n * - --stdio Enable stdio transport (default if no port)\n * - --log-level=<level> Logging level (default: info)\n * - --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)\n * - --base-url=<url> Base URL for HTTP file serving (optional)\n *\n * Environment Variables:\n * - GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n * - GOOGLE_CLIENT_SECRET OAuth client secret (optional)\n * - AUTH_MODE Default authentication mode (optional)\n * - HEADLESS Disable browser auto-open (optional)\n * - DCR_MODE DCR mode (optional, same format as --dcr-mode)\n * - DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n * - DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n * - PORT Default HTTP port (optional)\n * - LOG_LEVEL Default logging level (optional)\n * - STORAGE_DIR Default storage directory (optional)\n * - BASE_URL Default base URL for file serving (optional)\n *\n * OAuth Scopes (from constants.ts):\n * openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\n */\nexport function parseConfig(args: string[], env: Record<string, string | undefined>): ServerConfig {\n const transportConfig = parseTransportConfig(args, env);\n const oauthConfig = parseOAuthConfig(args, env);\n\n // Parse DCR configuration if DCR mode is enabled\n const dcrConfig = oauthConfig.auth === 'dcr' ? parseDcrConfig(args, env, GOOGLE_SCOPE) : undefined;\n\n // Parse application-level config (LOG_LEVEL, STORAGE_DIR, BASE_URL)\n const { values } = parseArgs({\n args,\n options: {\n 'log-level': { type: 'string' },\n 'storage-dir': { type: 'string' },\n 'base-url': { type: 'string' },\n },\n strict: false, // Allow other arguments\n allowPositionals: true,\n });\n\n const name = pkg.name.replace(/^@[^/]+\\//, '');\n // Parse repository URL from package.json, stripping git+ prefix and .git suffix\n const rawRepoUrl = typeof pkg.repository === 'object' ? pkg.repository.url : pkg.repository;\n const repositoryUrl = rawRepoUrl?.replace(/^git\\+/, '').replace(/\\.git$/, '') ?? `https://github.com/mcp-z/${name}`;\n const rootDir = process.cwd() === '/' ? homedir() : process.cwd();\n const baseDir = path.join(rootDir, '.mcp-z');\n const cliLogLevel = typeof values['log-level'] === 'string' ? values['log-level'] : undefined;\n const envLogLevel = env.LOG_LEVEL;\n const logLevel = cliLogLevel ?? envLogLevel ?? 'info';\n\n // Parse storage configuration\n const cliStorageDir = typeof values['storage-dir'] === 'string' ? values['storage-dir'] : undefined;\n const envStorageDir = env.STORAGE_DIR;\n let storageDir = cliStorageDir ?? envStorageDir ?? path.join(baseDir, name, 'files');\n if (storageDir.startsWith('~')) storageDir = storageDir.replace(/^~/, homedir());\n\n const cliBaseUrl = typeof values['base-url'] === 'string' ? values['base-url'] : undefined;\n const envBaseUrl = env.BASE_URL;\n const baseUrl = cliBaseUrl ?? envBaseUrl;\n\n // Combine configs\n const result: ServerConfig = {\n ...oauthConfig, // Includes clientId, auth, headless, redirectUri, serviceAccountKeyFile\n transport: transportConfig.transport,\n logLevel,\n baseDir,\n name,\n version: pkg.version,\n repositoryUrl,\n storageDir: path.resolve(storageDir),\n };\n if (baseUrl) result.baseUrl = baseUrl;\n if (dcrConfig !== undefined) result.dcrConfig = dcrConfig;\n return result;\n}\n\n/**\n * Build production configuration from process globals.\n * Entry point for production server.\n */\nexport function createConfig(): ServerConfig {\n return parseConfig(process.argv, process.env);\n}\n"],"names":["createConfig","handleVersionHelp","parseConfig","pkg","JSON","parse","fs","readFileSync","path","join","moduleRoot","url","fileURLToPath","HELP_TEXT","trim","args","values","parseArgs","options","version","type","help","strict","handled","output","env","cliLogLevel","cliStorageDir","transportConfig","parseTransportConfig","oauthConfig","parseOAuthConfig","dcrConfig","auth","parseDcrConfig","GOOGLE_SCOPE","undefined","allowPositionals","name","replace","rawRepoUrl","repository","repositoryUrl","rootDir","process","cwd","homedir","baseDir","envLogLevel","LOG_LEVEL","logLevel","envStorageDir","STORAGE_DIR","storageDir","startsWith","cliBaseUrl","envBaseUrl","BASE_URL","baseUrl","result","transport","resolve","argv"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/setup/config.ts"],"sourcesContent":["import { parseDcrConfig, parseConfig as parseOAuthConfig } from '@mcp-z/oauth-google';\nimport { findConfigPath, parseConfig as parseTransportConfig } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport { homedir } from 'os';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { parseArgs } from 'util';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\nconst pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));\n\nconst HELP_TEXT = `\nUsage: mcp-gmail [options]\n\nMCP server for Gmail email management with OAuth authentication.\n\nOptions:\n --version Show version number\n --help Show this help message\n --auth=<mode> Authentication mode (default: loopback-oauth)\n Modes: loopback-oauth, service-account, dcr\n --headless Disable browser auto-open, return auth URL instead\n --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n --dcr-verify-url=<url> External verification endpoint (required for external mode)\n --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n --port=<port> Enable HTTP transport on specified port\n --stdio Enable stdio transport (default if no port)\n --log-level=<level> Logging level (default: info)\n --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)\n --base-url=<url> Base URL for HTTP file serving (optional)\n\nEnvironment Variables:\n GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n GOOGLE_CLIENT_SECRET OAuth client secret (optional)\n AUTH_MODE Default authentication mode (optional)\n HEADLESS Disable browser auto-open (optional)\n DCR_MODE DCR mode (optional, same format as --dcr-mode)\n DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n PORT Default HTTP port (optional)\n LOG_LEVEL Default logging level (optional)\n STORAGE_DIR Default storage directory (optional)\n BASE_URL Default base URL for file serving (optional)\n\nOAuth Scopes:\n openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\n\nExamples:\n mcp-gmail # Use default settings\n mcp-gmail --auth=service-account # Use service account auth\n mcp-gmail --port=3000 # HTTP transport on port 3000\n mcp-gmail --storage-dir=./emails # Custom storage directory\n GOOGLE_CLIENT_ID=xxx mcp-gmail # Set client ID via env var\n`.trim();\n\n/**\n * Handle --version and --help flags before config parsing.\n * These should work without requiring any configuration.\n */\nexport function handleVersionHelp(args: string[]): { handled: boolean; output?: string } {\n const { values } = parseArgs({\n args,\n options: {\n version: { type: 'boolean' },\n help: { type: 'boolean' },\n },\n strict: false,\n });\n\n if (values.version) return { handled: true, output: pkg.version };\n if (values.help) return { handled: true, output: HELP_TEXT };\n return { handled: false };\n}\n\n/**\n * Parse Gmail server configuration from CLI arguments and environment.\n *\n * CLI Arguments (all optional):\n * - --auth=<mode> Authentication mode (default: loopback-oauth)\n * Modes: loopback-oauth, service-account, dcr\n * - --headless Disable browser auto-open, return auth URL instead\n * - --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n * - --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n * - --dcr-verify-url=<url> External verification endpoint (required for external mode)\n * - --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n * - --port=<port> Enable HTTP transport on specified port\n * - --stdio Enable stdio transport (default if no port)\n * - --log-level=<level> Logging level (default: info)\n * - --storage-dir=<path> Directory for CSV file storage (default: .mcp-z/files)\n * - --base-url=<url> Base URL for HTTP file serving (optional)\n *\n * Environment Variables:\n * - GOOGLE_CLIENT_ID OAuth client ID (REQUIRED)\n * - GOOGLE_CLIENT_SECRET OAuth client secret (optional)\n * - AUTH_MODE Default authentication mode (optional)\n * - HEADLESS Disable browser auto-open (optional)\n * - DCR_MODE DCR mode (optional, same format as --dcr-mode)\n * - DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n * - DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n * - PORT Default HTTP port (optional)\n * - LOG_LEVEL Default logging level (optional)\n * - STORAGE_DIR Default storage directory (optional)\n * - BASE_URL Default base URL for file serving (optional)\n *\n * OAuth Scopes (from constants.ts):\n * openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/\n */\nexport function parseConfig(args: string[], env: Record<string, string | undefined>): ServerConfig {\n const transportConfig = parseTransportConfig(args, env);\n const oauthConfig = parseOAuthConfig(args, env);\n\n // Parse DCR configuration if DCR mode is enabled\n const dcrConfig = oauthConfig.auth === 'dcr' ? parseDcrConfig(args, env, GOOGLE_SCOPE) : undefined;\n\n // Parse application-level config (LOG_LEVEL, STORAGE_DIR, BASE_URL)\n const { values } = parseArgs({\n args,\n options: {\n 'log-level': { type: 'string' },\n 'storage-dir': { type: 'string' },\n 'base-url': { type: 'string' },\n },\n strict: false, // Allow other arguments\n allowPositionals: true,\n });\n\n const name = pkg.name.replace(/^@[^/]+\\//, '');\n // Parse repository URL from package.json, stripping git+ prefix and .git suffix\n const rawRepoUrl = typeof pkg.repository === 'object' ? pkg.repository.url : pkg.repository;\n const repositoryUrl = rawRepoUrl?.replace(/^git\\+/, '').replace(/\\.git$/, '') ?? `https://github.com/mcp-z/${name}`;\n let rootDir = homedir();\n try {\n const configPath = findConfigPath({ config: '.mcp.json', cwd: process.cwd(), stopDir: homedir() });\n rootDir = path.dirname(configPath);\n } catch {\n rootDir = homedir();\n }\n const baseDir = path.join(rootDir, '.mcp-z');\n const cliLogLevel = typeof values['log-level'] === 'string' ? values['log-level'] : undefined;\n const envLogLevel = env.LOG_LEVEL;\n const logLevel = cliLogLevel ?? envLogLevel ?? 'info';\n\n // Parse storage configuration\n const cliStorageDir = typeof values['storage-dir'] === 'string' ? values['storage-dir'] : undefined;\n const envStorageDir = env.STORAGE_DIR;\n let storageDir = cliStorageDir ?? envStorageDir ?? path.join(baseDir, name, 'files');\n if (storageDir.startsWith('~')) storageDir = storageDir.replace(/^~/, homedir());\n\n const cliBaseUrl = typeof values['base-url'] === 'string' ? values['base-url'] : undefined;\n const envBaseUrl = env.BASE_URL;\n const baseUrl = cliBaseUrl ?? envBaseUrl;\n\n // Combine configs\n const result: ServerConfig = {\n ...oauthConfig, // Includes clientId, auth, headless, redirectUri, serviceAccountKeyFile\n transport: transportConfig.transport,\n logLevel,\n baseDir,\n name,\n version: pkg.version,\n repositoryUrl,\n storageDir: path.resolve(storageDir),\n };\n if (baseUrl) result.baseUrl = baseUrl;\n if (dcrConfig !== undefined) result.dcrConfig = dcrConfig;\n return result;\n}\n\n/**\n * Build production configuration from process globals.\n * Entry point for production server.\n */\nexport function createConfig(): ServerConfig {\n return parseConfig(process.argv, process.env);\n}\n"],"names":["createConfig","handleVersionHelp","parseConfig","pkg","JSON","parse","fs","readFileSync","path","join","moduleRoot","url","fileURLToPath","HELP_TEXT","trim","args","values","parseArgs","options","version","type","help","strict","handled","output","env","cliLogLevel","cliStorageDir","transportConfig","parseTransportConfig","oauthConfig","parseOAuthConfig","dcrConfig","auth","parseDcrConfig","GOOGLE_SCOPE","undefined","allowPositionals","name","replace","rawRepoUrl","repository","repositoryUrl","rootDir","homedir","configPath","findConfigPath","config","cwd","process","stopDir","dirname","baseDir","envLogLevel","LOG_LEVEL","logLevel","envStorageDir","STORAGE_DIR","storageDir","startsWith","cliBaseUrl","envBaseUrl","BASE_URL","baseUrl","result","transport","resolve","argv"],"mappings":"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"}
@@ -12,7 +12,7 @@ var _server = require("@mcp-z/server");
12
12
  var _mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
13
13
  var _cors = /*#__PURE__*/ _interop_require_default(require("cors"));
14
14
  var _express = /*#__PURE__*/ _interop_require_default(require("express"));
15
- var _runtime = require("./runtime.js");
15
+ var _runtimets = require("./runtime.js");
16
16
  function _array_like_to_array(arr, len) {
17
17
  if (len == null || len > arr.length) len = arr.length;
18
18
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
@@ -179,7 +179,7 @@ function createHTTPServer(config, overrides) {
179
179
  case 0:
180
180
  return [
181
181
  4,
182
- (0, _runtime.createDefaultRuntime)(config, overrides)
182
+ (0, _runtimets.createDefaultRuntime)(config, overrides)
183
183
  ];
184
184
  case 1:
185
185
  runtime = _state.sent();
@@ -205,6 +205,10 @@ function createHTTPServer(config, overrides) {
205
205
  app.use(_express.default.json({
206
206
  limit: '10mb'
207
207
  }));
208
+ if (runtime.deps.oauthAdapters.loopbackRouter) {
209
+ app.use('/', runtime.deps.oauthAdapters.loopbackRouter);
210
+ logger.info('Mounted loopback OAuth callback router');
211
+ }
208
212
  fileRouter = (0, _server.createFileServingRouter)({
209
213
  storageDir: config.storageDir
210
214
  }, {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.js';\nimport { createDefaultRuntime } from './runtime.js';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, tools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(cors());\n app.use(express.json({ limit: '10mb' }));\n\n const fileRouter = createFileServingRouter({ storageDir: config.storageDir }, { contentType: 'text/csv', contentDisposition: 'attachment' });\n app.use('/files', fileRouter);\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, { logger, app, port });\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["createHTTPServer","config","overrides","runtime","modules","layers","composed","logger","port","tools","prompts","mcpServer","app","fileRouter","close","httpServer","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","transport","Error","oauthAdapters","accountTools","accountPrompts","McpServer","name","version","registerTools","registerResources","resources","registerPrompts","express","use","cors","json","limit","createFileServingRouter","storageDir","contentType","contentDisposition","dcrRouter","info","connectHttp"],"mappings":";;;;+BAOsBA;;;eAAAA;;;sBAPqG;mBACjG;2DACT;8DACG;uBAEiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9B,SAAeA,iBAAiBC,MAAoB,EAAEC,SAA4B;;YACjFC,SACAC,SACAC,QACAC,UACAC,QACAC,MAGAC,OACAC,SAEAC,WAKAC,KAIAC,YASwB,MAAtBC,OAAOC;;;;oBA7BC;;wBAAMC,IAAAA,6BAAoB,EAACf,QAAQC;;;oBAA7CC,UAAU;oBACVC,UAAUD,QAAQc,mBAAmB;oBACrCZ,SAASF,QAAQe,mBAAmB,CAACC,GAAG,CAAC,SAACC;+BAAYA,QAAQjB,QAAQkB,IAAI;;oBAC1Ef,WAAWgB,IAAAA,yBAAiB,EAAClB,SAASC;oBACtCE,SAASJ,QAAQkB,IAAI,CAACd,MAAM;oBAC5BC,OAAOP,OAAOsB,SAAS,CAACf,IAAI;oBAClC,IAAI,CAACA,MAAM,MAAM,IAAIgB,MAAM;oBAErBf,QAAQ,AAAC,qBAAGH,SAASG,KAAK,SAAE,qBAAGN,QAAQkB,IAAI,CAACI,aAAa,CAACC,YAAY;oBACtEhB,UAAU,AAAC,qBAAGJ,SAASI,OAAO,SAAE,qBAAGP,QAAQkB,IAAI,CAACI,aAAa,CAACE,cAAc;oBAE5EhB,YAAY,IAAIiB,cAAS,CAAC;wBAAEC,MAAM5B,OAAO4B,IAAI;wBAAEC,SAAS7B,OAAO6B,OAAO;oBAAC;oBAC7EC,IAAAA,qBAAa,EAACpB,WAAWF;oBACzBuB,IAAAA,yBAAiB,EAACrB,WAAWL,SAAS2B,SAAS;oBAC/CC,IAAAA,uBAAe,EAACvB,WAAWD;oBAErBE,MAAMuB,IAAAA,gBAAO;oBACnBvB,IAAIwB,GAAG,CAACC,IAAAA,aAAI;oBACZzB,IAAIwB,GAAG,CAACD,gBAAO,CAACG,IAAI,CAAC;wBAAEC,OAAO;oBAAO;oBAE/B1B,aAAa2B,IAAAA,+BAAuB,EAAC;wBAAEC,YAAYxC,OAAOwC,UAAU;oBAAC,GAAG;wBAAEC,aAAa;wBAAYC,oBAAoB;oBAAa;oBAC1I/B,IAAIwB,GAAG,CAAC,UAAUvB;oBAElB,IAAIV,QAAQkB,IAAI,CAACI,aAAa,CAACmB,SAAS,EAAE;wBACxChC,IAAIwB,GAAG,CAAC,KAAKjC,QAAQkB,IAAI,CAACI,aAAa,CAACmB,SAAS;wBACjDrC,OAAOsC,IAAI,CAAC;oBACd;oBAEAtC,OAAOsC,IAAI,CAAC,AAAC,YAAuB,OAAZ5C,OAAO4B,IAAI,EAAC;oBACN;;wBAAMiB,IAAAA,mBAAW,EAACnC,WAAW;4BAAEJ,QAAAA;4BAAQK,KAAAA;4BAAKJ,MAAAA;wBAAK;;;oBAAjD,OAAA,eAAtBM,QAAsB,KAAtBA,OAAOC,aAAe,KAAfA;oBACfR,OAAOsC,IAAI,CAAC;oBAEZ;;wBAAO;4BACL9B,YAAAA;4BACAJ,WAAAA;4BACAJ,QAAAA;4BACAO,OAAO;;;;;gDACL;;oDAAMA;;;gDAAN;gDACA;;oDAAMX,QAAQW,KAAK;;;gDAAnB;;;;;;gCACF;;wBACF;;;;IACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, tools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(cors());\n app.use(express.json({ limit: '10mb' }));\n\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n const fileRouter = createFileServingRouter({ storageDir: config.storageDir }, { contentType: 'text/csv', contentDisposition: 'attachment' });\n app.use('/files', fileRouter);\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, { logger, app, port });\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["createHTTPServer","config","overrides","runtime","modules","layers","composed","logger","port","tools","prompts","mcpServer","app","fileRouter","close","httpServer","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","transport","Error","oauthAdapters","accountTools","accountPrompts","McpServer","name","version","registerTools","registerResources","resources","registerPrompts","express","use","cors","json","limit","loopbackRouter","info","createFileServingRouter","storageDir","contentType","contentDisposition","dcrRouter","connectHttp"],"mappings":";;;;+BAOsBA;;;eAAAA;;;sBAPqG;mBACjG;2DACT;8DACG;yBAEiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9B,SAAeA,iBAAiBC,MAAoB,EAAEC,SAA4B;;YACjFC,SACAC,SACAC,QACAC,UACAC,QACAC,MAGAC,OACAC,SAEAC,WAKAC,KASAC,YASwB,MAAtBC,OAAOC;;;;oBAlCC;;wBAAMC,IAAAA,+BAAoB,EAACf,QAAQC;;;oBAA7CC,UAAU;oBACVC,UAAUD,QAAQc,mBAAmB;oBACrCZ,SAASF,QAAQe,mBAAmB,CAACC,GAAG,CAAC,SAACC;+BAAYA,QAAQjB,QAAQkB,IAAI;;oBAC1Ef,WAAWgB,IAAAA,yBAAiB,EAAClB,SAASC;oBACtCE,SAASJ,QAAQkB,IAAI,CAACd,MAAM;oBAC5BC,OAAOP,OAAOsB,SAAS,CAACf,IAAI;oBAClC,IAAI,CAACA,MAAM,MAAM,IAAIgB,MAAM;oBAErBf,QAAQ,AAAC,qBAAGH,SAASG,KAAK,SAAE,qBAAGN,QAAQkB,IAAI,CAACI,aAAa,CAACC,YAAY;oBACtEhB,UAAU,AAAC,qBAAGJ,SAASI,OAAO,SAAE,qBAAGP,QAAQkB,IAAI,CAACI,aAAa,CAACE,cAAc;oBAE5EhB,YAAY,IAAIiB,cAAS,CAAC;wBAAEC,MAAM5B,OAAO4B,IAAI;wBAAEC,SAAS7B,OAAO6B,OAAO;oBAAC;oBAC7EC,IAAAA,qBAAa,EAACpB,WAAWF;oBACzBuB,IAAAA,yBAAiB,EAACrB,WAAWL,SAAS2B,SAAS;oBAC/CC,IAAAA,uBAAe,EAACvB,WAAWD;oBAErBE,MAAMuB,IAAAA,gBAAO;oBACnBvB,IAAIwB,GAAG,CAACC,IAAAA,aAAI;oBACZzB,IAAIwB,GAAG,CAACD,gBAAO,CAACG,IAAI,CAAC;wBAAEC,OAAO;oBAAO;oBAErC,IAAIpC,QAAQkB,IAAI,CAACI,aAAa,CAACe,cAAc,EAAE;wBAC7C5B,IAAIwB,GAAG,CAAC,KAAKjC,QAAQkB,IAAI,CAACI,aAAa,CAACe,cAAc;wBACtDjC,OAAOkC,IAAI,CAAC;oBACd;oBAEM5B,aAAa6B,IAAAA,+BAAuB,EAAC;wBAAEC,YAAY1C,OAAO0C,UAAU;oBAAC,GAAG;wBAAEC,aAAa;wBAAYC,oBAAoB;oBAAa;oBAC1IjC,IAAIwB,GAAG,CAAC,UAAUvB;oBAElB,IAAIV,QAAQkB,IAAI,CAACI,aAAa,CAACqB,SAAS,EAAE;wBACxClC,IAAIwB,GAAG,CAAC,KAAKjC,QAAQkB,IAAI,CAACI,aAAa,CAACqB,SAAS;wBACjDvC,OAAOkC,IAAI,CAAC;oBACd;oBAEAlC,OAAOkC,IAAI,CAAC,AAAC,YAAuB,OAAZxC,OAAO4B,IAAI,EAAC;oBACN;;wBAAMkB,IAAAA,mBAAW,EAACpC,WAAW;4BAAEJ,QAAAA;4BAAQK,KAAAA;4BAAKJ,MAAAA;wBAAK;;;oBAAjD,OAAA,eAAtBM,QAAsB,KAAtBA,OAAOC,aAAe,KAAfA;oBACfR,OAAOkC,IAAI,CAAC;oBAEZ;;wBAAO;4BACL1B,YAAAA;4BACAJ,WAAAA;4BACAJ,QAAAA;4BACAO,OAAO;;;;;gDACL;;oDAAMA;;;gDAAN;gDACA;;oDAAMX,QAAQW,KAAK;;;gDAAnB;;;;;;gCACF;;wBACF;;;;IACF"}
@@ -1,5 +1,6 @@
1
1
  export { createConfig, parseConfig } from './config.js';
2
2
  export { createHTTPServer } from './http.js';
3
+ export type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './oauth-google.js';
3
4
  export { createOAuthAdapters } from './oauth-google.js';
4
5
  export * from './runtime.js';
5
6
  export { createStdioServer } from './stdio.js';
@@ -1,5 +1,6 @@
1
1
  export { createConfig, parseConfig } from './config.js';
2
2
  export { createHTTPServer } from './http.js';
3
+ export type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './oauth-google.js';
3
4
  export { createOAuthAdapters } from './oauth-google.js';
4
5
  export * from './runtime.js';
5
6
  export { createStdioServer } from './stdio.js';
@@ -10,26 +10,26 @@ function _export(target, all) {
10
10
  }
11
11
  _export(exports, {
12
12
  get createConfig () {
13
- return _config.createConfig;
13
+ return _configts.createConfig;
14
14
  },
15
15
  get createHTTPServer () {
16
- return _http.createHTTPServer;
16
+ return _httpts.createHTTPServer;
17
17
  },
18
18
  get createOAuthAdapters () {
19
- return _oauthgoogle.createOAuthAdapters;
19
+ return _oauthgooglets.createOAuthAdapters;
20
20
  },
21
21
  get createStdioServer () {
22
- return _stdio.createStdioServer;
22
+ return _stdiots.createStdioServer;
23
23
  },
24
24
  get parseConfig () {
25
- return _config.parseConfig;
25
+ return _configts.parseConfig;
26
26
  }
27
27
  });
28
- var _config = require("./config.js");
29
- var _http = require("./http.js");
30
- var _oauthgoogle = require("./oauth-google.js");
28
+ var _configts = require("./config.js");
29
+ var _httpts = require("./http.js");
30
+ var _oauthgooglets = require("./oauth-google.js");
31
31
  _export_star(require("./runtime.js"), exports);
32
- var _stdio = require("./stdio.js");
32
+ var _stdiots = require("./stdio.js");
33
33
  function _export_star(from, to) {
34
34
  Object.keys(from).forEach(function(k) {
35
35
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/setup/index.ts"],"sourcesContent":["export { createConfig, parseConfig } from './config.js';\nexport { createHTTPServer } from './http.js';\nexport { createOAuthAdapters } from './oauth-google.js';\nexport * from './runtime.js';\nexport { createStdioServer } from './stdio.js';\n"],"names":["createConfig","createHTTPServer","createOAuthAdapters","createStdioServer","parseConfig"],"mappings":";;;;;;;;;;;QAASA;eAAAA,oBAAY;;QACZC;eAAAA,sBAAgB;;QAChBC;eAAAA,gCAAmB;;QAEnBC;eAAAA,wBAAiB;;QAJHC;eAAAA,mBAAW;;;sBAAQ;oBACT;2BACG;qBACtB;qBACoB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/setup/index.ts"],"sourcesContent":["export { createConfig, parseConfig } from './config.ts';\nexport { createHTTPServer } from './http.ts';\nexport type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './oauth-google.ts';\nexport { createOAuthAdapters } from './oauth-google.ts';\nexport * from './runtime.ts';\nexport { createStdioServer } from './stdio.ts';\n"],"names":["createConfig","createHTTPServer","createOAuthAdapters","createStdioServer","parseConfig"],"mappings":";;;;;;;;;;;QAASA;eAAAA,sBAAY;;QACZC;eAAAA,wBAAgB;;QAEhBC;eAAAA,kCAAmB;;QAEnBC;eAAAA,0BAAiB;;QALHC;eAAAA,qBAAW;;;wBAAQ;sBACT;6BAEG;qBACtB;uBACoB"}
@@ -1,4 +1,4 @@
1
- import { type AuthEmailProvider } from '@mcp-z/oauth';
1
+ import { type AccountAuthProvider } from '@mcp-z/oauth';
2
2
  import type { CachedToken } from '@mcp-z/oauth-google';
3
3
  import { DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';
4
4
  import type { Logger, PromptModule, ToolModule } from '@mcp-z/server';
@@ -40,10 +40,11 @@ export interface AuthMiddleware {
40
40
  export interface OAuthAdapters {
41
41
  primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;
42
42
  middleware: AuthMiddleware;
43
- authAdapter: AuthEmailProvider;
43
+ authAdapter: AccountAuthProvider;
44
44
  accountTools: ToolModule[];
45
45
  accountPrompts: PromptModule[];
46
46
  dcrRouter?: Router;
47
+ loopbackRouter?: Router;
47
48
  }
48
49
  /**
49
50
  * Create Gmail OAuth adapters and helpers.
@@ -1,4 +1,4 @@
1
- import { type AuthEmailProvider } from '@mcp-z/oauth';
1
+ import { type AccountAuthProvider } from '@mcp-z/oauth';
2
2
  import type { CachedToken } from '@mcp-z/oauth-google';
3
3
  import { DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';
4
4
  import type { Logger, PromptModule, ToolModule } from '@mcp-z/server';
@@ -40,10 +40,11 @@ export interface AuthMiddleware {
40
40
  export interface OAuthAdapters {
41
41
  primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;
42
42
  middleware: AuthMiddleware;
43
- authAdapter: AuthEmailProvider;
43
+ authAdapter: AccountAuthProvider;
44
44
  accountTools: ToolModule[];
45
45
  accountPrompts: PromptModule[];
46
46
  dcrRouter?: Router;
47
+ loopbackRouter?: Router;
47
48
  }
48
49
  /**
49
50
  * Create Gmail OAuth adapters and helpers.
@@ -53,6 +53,13 @@ function _define_property(obj, key, value) {
53
53
  }
54
54
  return obj;
55
55
  }
56
+ function _instanceof(left, right) {
57
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
58
+ return !!right[Symbol.hasInstance](left);
59
+ } else {
60
+ return left instanceof right;
61
+ }
62
+ }
56
63
  function _object_spread(target) {
57
64
  for(var i = 1; i < arguments.length; i++){
58
65
  var source = arguments[i] != null ? arguments[i] : {};
@@ -193,7 +200,7 @@ function _ts_generator(thisArg, body) {
193
200
  }
194
201
  function createOAuthAdapters(config, deps, baseUrl) {
195
202
  return _async_to_generator(function() {
196
- var logger, tokenStore, dcrStore, oauthStaticConfig, primary, dcrRouter, middleware, authAdapter, authAdapter1, middleware1, accountTools, accountPrompts, result;
203
+ var logger, tokenStore, dcrStore, oauthStaticConfig, primary, dcrRouter, middleware, authAdapter, authAdapter1, middleware1, accountTools, accountPrompts, result, loopbackRouter;
197
204
  return _ts_generator(this, function(_state) {
198
205
  logger = deps.logger, tokenStore = deps.tokenStore, dcrStore = deps.dcrStore;
199
206
  oauthStaticConfig = _object_spread({
@@ -241,6 +248,9 @@ function createOAuthAdapters(config, deps, baseUrl) {
241
248
  });
242
249
  middleware = primary.authMiddleware();
243
250
  authAdapter = {
251
+ getAccessToken: function() {
252
+ throw new Error('DCR mode does not support getAccessToken - tokens are provided via bearer auth');
253
+ },
244
254
  getUserEmail: function() {
245
255
  throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');
246
256
  }
@@ -285,16 +295,7 @@ function createOAuthAdapters(config, deps, baseUrl) {
285
295
  redirectUri: oauthStaticConfig.redirectUri
286
296
  }));
287
297
  }
288
- authAdapter1 = _object_spread({
289
- getUserEmail: function(accountId) {
290
- return primary.getUserEmail(accountId);
291
- }
292
- }, 'authenticateNewAccount' in primary && primary.authenticateNewAccount ? {
293
- authenticateNewAccount: function() {
294
- var _primary_authenticateNewAccount;
295
- return (_primary_authenticateNewAccount = primary.authenticateNewAccount) === null || _primary_authenticateNewAccount === void 0 ? void 0 : _primary_authenticateNewAccount.call(primary);
296
- }
297
- } : {});
298
+ authAdapter1 = primary;
298
299
  if (oauthStaticConfig.auth === 'service-account') {
299
300
  middleware1 = primary.authMiddleware();
300
301
  accountTools = [];
@@ -316,6 +317,7 @@ function createOAuthAdapters(config, deps, baseUrl) {
316
317
  service: oauthStaticConfig.service
317
318
  });
318
319
  }
320
+ loopbackRouter = _instanceof(primary, _oauthgoogle.LoopbackOAuthProvider) && oauthStaticConfig.redirectUri ? (0, _oauthgoogle.createLoopbackCallbackRouter)(primary) : undefined;
319
321
  return [
320
322
  2,
321
323
  {
@@ -323,7 +325,8 @@ function createOAuthAdapters(config, deps, baseUrl) {
323
325
  middleware: middleware1,
324
326
  authAdapter: authAdapter1,
325
327
  accountTools: accountTools,
326
- accountPrompts: accountPrompts
328
+ accountPrompts: accountPrompts,
329
+ loopbackRouter: loopbackRouter
327
330
  }
328
331
  ];
329
332
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/setup/oauth-google.ts"],"sourcesContent":["import { AccountServer, type AuthEmailProvider } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport { createDcrRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.js';\n\n/**\n * Gmail OAuth runtime dependencies.\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<CachedToken>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware helpers used to wrap MCP modules.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n withResourceAuth<T extends { name: string; template?: unknown; config?: unknown; handler: unknown }>(module: T): T;\n withPromptAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n}\n\n/**\n * Result returned by createOAuthAdapters.\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AuthEmailProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router;\n}\n\n/**\n * Create Gmail OAuth adapters and helpers.\n *\n * @param config Gmail server configuration.\n * @param deps Runtime dependencies (logger, token store, optional DCR store).\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: GOOGLE_SCOPE,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(config.serviceAccountKeyFile && { serviceAccountKeyFile: config.serviceAccountKeyFile }),\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n if (!dcrStore) {\n throw new Error('DCR mode requires dcrStore to be configured');\n }\n if (!oauthStaticConfig.baseUrl) {\n throw new Error('DCR mode requires baseUrl to be configured');\n }\n\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '),\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n },\n });\n\n const middleware = primary.authMiddleware();\n const authAdapter: AuthEmailProvider = {\n getUserEmail: () => {\n throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');\n },\n };\n\n return {\n primary,\n middleware: middleware as unknown as AuthMiddleware,\n authAdapter,\n accountTools: [],\n accountPrompts: [],\n dcrRouter,\n };\n }\n\n if (oauthStaticConfig.auth === 'service-account') {\n if (!oauthStaticConfig.serviceAccountKeyFile) {\n throw new Error('Service account key file is required when auth mode is \"service-account\". Set GOOGLE_SERVICE_ACCOUNT_KEY_FILE environment variable or use --service-account-key-file flag.');\n }\n\n logger.debug('Creating service account provider', { service: oauthStaticConfig.service });\n primary = new ServiceAccountProvider({\n keyFilePath: oauthStaticConfig.serviceAccountKeyFile,\n scopes: oauthStaticConfig.scope.split(' '),\n logger,\n });\n } else {\n logger.debug('Creating loopback OAuth provider', { service: oauthStaticConfig.service });\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n }\n\n const authAdapter: AuthEmailProvider = {\n getUserEmail: (accountId) => primary.getUserEmail(accountId),\n ...('authenticateNewAccount' in primary && primary.authenticateNewAccount\n ? {\n authenticateNewAccount: () => primary.authenticateNewAccount?.(),\n }\n : {}),\n };\n\n let middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']>;\n let accountTools: ToolModule[];\n let accountPrompts: PromptModule[];\n\n if (oauthStaticConfig.auth === 'service-account') {\n middleware = primary.authMiddleware();\n accountTools = [];\n accountPrompts = [];\n logger.debug('Service account mode - no account tools', { service: oauthStaticConfig.service });\n } else {\n middleware = primary.authMiddleware();\n\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n accountTools = result.tools as ToolModule[];\n accountPrompts = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n }\n\n return {\n primary,\n middleware: middleware as unknown as AuthMiddleware,\n authAdapter,\n accountTools,\n accountPrompts,\n };\n}\n"],"names":["createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","primary","dcrRouter","middleware","authAdapter","accountTools","accountPrompts","result","service","name","clientId","clientSecret","scope","GOOGLE_SCOPE","auth","headless","redirectUri","transport","type","undefined","serviceAccountKeyFile","debug","Error","DcrOAuthProvider","verifyEndpoint","createDcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","authMiddleware","getUserEmail","ServiceAccountProvider","keyFilePath","scopes","LoopbackOAuthProvider","accountId","authenticateNewAccount","AccountServer","createLoopback","tools","prompts"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/setup/oauth-google.ts"],"sourcesContent":["import { type AccountAuthProvider, AccountServer } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport { createDcrRouter, createLoopbackCallbackRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\n/**\n * Gmail OAuth runtime dependencies.\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<CachedToken>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware helpers used to wrap MCP modules.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n withResourceAuth<T extends { name: string; template?: unknown; config?: unknown; handler: unknown }>(module: T): T;\n withPromptAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n}\n\n/**\n * Result returned by createOAuthAdapters.\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AccountAuthProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router;\n loopbackRouter?: Router;\n}\n\n/**\n * Create Gmail OAuth adapters and helpers.\n *\n * @param config Gmail server configuration.\n * @param deps Runtime dependencies (logger, token store, optional DCR store).\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: GOOGLE_SCOPE,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(config.serviceAccountKeyFile && { serviceAccountKeyFile: config.serviceAccountKeyFile }),\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n if (!dcrStore) {\n throw new Error('DCR mode requires dcrStore to be configured');\n }\n if (!oauthStaticConfig.baseUrl) {\n throw new Error('DCR mode requires baseUrl to be configured');\n }\n\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '),\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n },\n });\n\n const middleware = primary.authMiddleware();\n const authAdapter: AccountAuthProvider = {\n getAccessToken: () => {\n throw new Error('DCR mode does not support getAccessToken - tokens are provided via bearer auth');\n },\n getUserEmail: () => {\n throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');\n },\n };\n\n return {\n primary,\n middleware: middleware as unknown as AuthMiddleware,\n authAdapter,\n accountTools: [],\n accountPrompts: [],\n dcrRouter,\n };\n }\n\n if (oauthStaticConfig.auth === 'service-account') {\n if (!oauthStaticConfig.serviceAccountKeyFile) {\n throw new Error('Service account key file is required when auth mode is \"service-account\". Set GOOGLE_SERVICE_ACCOUNT_KEY_FILE environment variable or use --service-account-key-file flag.');\n }\n\n logger.debug('Creating service account provider', { service: oauthStaticConfig.service });\n primary = new ServiceAccountProvider({\n keyFilePath: oauthStaticConfig.serviceAccountKeyFile,\n scopes: oauthStaticConfig.scope.split(' '),\n logger,\n });\n } else {\n logger.debug('Creating loopback OAuth provider', { service: oauthStaticConfig.service });\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n }\n\n const authAdapter: AccountAuthProvider = primary;\n\n let middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']>;\n let accountTools: ToolModule[];\n let accountPrompts: PromptModule[];\n\n if (oauthStaticConfig.auth === 'service-account') {\n middleware = primary.authMiddleware();\n accountTools = [];\n accountPrompts = [];\n logger.debug('Service account mode - no account tools', { service: oauthStaticConfig.service });\n } else {\n middleware = primary.authMiddleware();\n\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n accountTools = result.tools as ToolModule[];\n accountPrompts = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n }\n\n const loopbackRouter = primary instanceof LoopbackOAuthProvider && oauthStaticConfig.redirectUri ? createLoopbackCallbackRouter(primary) : undefined;\n\n return {\n primary,\n middleware: middleware as unknown as AuthMiddleware,\n authAdapter,\n accountTools,\n accountPrompts,\n loopbackRouter,\n };\n}\n"],"names":["createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","primary","dcrRouter","middleware","authAdapter","accountTools","accountPrompts","result","loopbackRouter","service","name","clientId","clientSecret","scope","GOOGLE_SCOPE","auth","headless","redirectUri","transport","type","undefined","serviceAccountKeyFile","debug","Error","DcrOAuthProvider","verifyEndpoint","createDcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","authMiddleware","getAccessToken","getUserEmail","ServiceAccountProvider","keyFilePath","scopes","LoopbackOAuthProvider","AccountServer","createLoopback","tools","prompts","createLoopbackCallbackRouter"],"mappings":"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"}
@@ -39,9 +39,9 @@ var _server = require("@mcp-z/server");
39
39
  var _fs = /*#__PURE__*/ _interop_require_wildcard(require("fs"));
40
40
  var _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
41
41
  var _pino = /*#__PURE__*/ _interop_require_default(require("pino"));
42
- var _createstore = /*#__PURE__*/ _interop_require_default(require("../lib/create-store.js"));
43
- var _index = /*#__PURE__*/ _interop_require_wildcard(require("../mcp/index.js"));
44
- var _oauthgoogle = require("./oauth-google.js");
42
+ var _createstorets = /*#__PURE__*/ _interop_require_default(require("../lib/create-store.js"));
43
+ var _indexts = /*#__PURE__*/ _interop_require_wildcard(require("../mcp/index.js"));
44
+ var _oauthgooglets = require("./oauth-google.js");
45
45
  function _array_like_to_array(arr, len) {
46
46
  if (len == null || len > arr.length) len = arr.length;
47
47
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
@@ -315,7 +315,7 @@ function createTokenStore(baseDir) {
315
315
  storeUri = process.env.STORE_URI || "file://".concat(_path.join(baseDir, 'tokens.json'));
316
316
  return [
317
317
  2,
318
- (0, _createstore.default)(storeUri)
318
+ (0, _createstorets.default)(storeUri)
319
319
  ];
320
320
  });
321
321
  })();
@@ -331,7 +331,7 @@ function createDcrStore(baseDir, required) {
331
331
  dcrStoreUri = process.env.DCR_STORE_URI || "file://".concat(_path.join(baseDir, 'dcr.json'));
332
332
  return [
333
333
  2,
334
- (0, _createstore.default)(dcrStoreUri)
334
+ (0, _createstorets.default)(dcrStoreUri)
335
335
  ];
336
336
  });
337
337
  })();
@@ -422,7 +422,7 @@ function createDefaultRuntime(config, overrides) {
422
422
  dcrStore = _state.sent();
423
423
  return [
424
424
  4,
425
- (0, _oauthgoogle.createOAuthAdapters)(config, {
425
+ (0, _oauthgooglets.createOAuthAdapters)(config, {
426
426
  logger: logger,
427
427
  tokenStore: tokenStore,
428
428
  dcrStore: dcrStore
@@ -439,13 +439,13 @@ function createDefaultRuntime(config, overrides) {
439
439
  };
440
440
  createDomainModules = (_ref = overrides === null || overrides === void 0 ? void 0 : overrides.createDomainModules) !== null && _ref !== void 0 ? _ref : function() {
441
441
  return {
442
- tools: Object.values(_index.toolFactories).map(function(factory) {
442
+ tools: Object.values(_indexts.toolFactories).map(function(factory) {
443
443
  return factory();
444
444
  }),
445
- resources: Object.values(_index.resourceFactories).map(function(factory) {
445
+ resources: Object.values(_indexts.resourceFactories).map(function(factory) {
446
446
  return factory();
447
447
  }),
448
- prompts: Object.values(_index.promptFactories).map(function(factory) {
448
+ prompts: Object.values(_indexts.promptFactories).map(function(factory) {
449
449
  return factory();
450
450
  })
451
451
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/setup/runtime.ts"],"sourcesContent":["import { sanitizeForLoggingFormatter } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport type { Logger, MiddlewareLayer } from '@mcp-z/server';\nimport { createLoggingMiddleware } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport pino from 'pino';\nimport createStore from '../lib/create-store.js';\nimport * as mcp from '../mcp/index.js';\nimport type { CommonRuntime, RuntimeDeps, RuntimeOverrides, ServerConfig, StorageContext } from '../types.js';\nimport { createOAuthAdapters, type OAuthAdapters } from './oauth-google.js';\n\nexport function createLogger(config: ServerConfig): Logger {\n const hasStdio = config.transport.type === 'stdio';\n const logsPath = path.join(config.baseDir, 'logs', `${config.name}.log`);\n if (hasStdio) fs.mkdirSync(path.dirname(logsPath), { recursive: true });\n return pino({ level: config.logLevel ?? 'info', formatters: sanitizeForLoggingFormatter() }, hasStdio ? pino.destination({ dest: logsPath, sync: false }) : pino.destination(1));\n}\n\nexport async function createTokenStore(baseDir: string) {\n const storeUri = process.env.STORE_URI || `file://${path.join(baseDir, 'tokens.json')}`;\n return createStore<CachedToken>(storeUri);\n}\n\nexport async function createDcrStore(baseDir: string, required: boolean) {\n if (!required) return undefined;\n const dcrStoreUri = process.env.DCR_STORE_URI || `file://${path.join(baseDir, 'dcr.json')}`;\n return createStore<unknown>(dcrStoreUri);\n}\n\nexport function createAuthLayer(authMiddleware: OAuthAdapters['middleware']): MiddlewareLayer {\n return {\n withTool: authMiddleware.withToolAuth,\n withResource: authMiddleware.withResourceAuth,\n withPrompt: authMiddleware.withPromptAuth,\n };\n}\n\nexport function createLoggingLayer(logger: Logger): MiddlewareLayer {\n const logging = createLoggingMiddleware({ logger });\n return {\n withTool: logging.withToolLogging,\n withResource: logging.withResourceLogging,\n withPrompt: logging.withPromptLogging,\n };\n}\n\nexport function createStorageLayer(storageContext: StorageContext): MiddlewareLayer {\n const wrapAtPosition = <T extends { name: string; handler: unknown; [key: string]: unknown }>(module: T, extraPosition: number): T => {\n const originalHandler = module.handler as (...args: unknown[]) => Promise<unknown>;\n\n const wrappedHandler = async (...allArgs: unknown[]) => {\n const extra = allArgs[extraPosition];\n (extra as { storageContext?: StorageContext }).storageContext = storageContext;\n return await originalHandler(...allArgs);\n };\n\n return {\n ...module,\n handler: wrappedHandler,\n } as T;\n };\n\n return {\n withTool: <T extends { name: string; config: unknown; handler: unknown }>(module: T): T => wrapAtPosition(module, 1) as T,\n };\n}\n\nexport function assertStorageConfig(config: ServerConfig) {\n if (!config.storageDir) {\n throw new Error('gmail-messages-export-csv: Server configuration missing storageDir.');\n }\n if (config.transport.type === 'http' && !config.baseUrl && !config.transport.port) {\n throw new Error('gmail-messages-export-csv: HTTP transport requires either baseUrl in server config or port in transport config. This is a server configuration error - please provide --base-url or --port.');\n }\n}\n\nexport async function createDefaultRuntime(config: ServerConfig, overrides?: RuntimeOverrides): Promise<CommonRuntime> {\n if (config.auth === 'dcr' && config.transport.type !== 'http') throw new Error('DCR mode requires an HTTP transport');\n\n assertStorageConfig(config);\n const logger = createLogger(config);\n const tokenStore = await createTokenStore(config.baseDir);\n const baseUrl = config.baseUrl ?? (config.transport.type === 'http' && config.transport.port ? `http://localhost:${config.transport.port}` : undefined);\n const dcrStore = await createDcrStore(config.baseDir, config.auth === 'dcr');\n const oauthAdapters = await createOAuthAdapters(config, { logger, tokenStore, dcrStore }, baseUrl);\n const deps: RuntimeDeps = { config, logger, tokenStore, oauthAdapters, baseUrl };\n const createDomainModules =\n overrides?.createDomainModules ??\n (() => ({\n tools: Object.values(mcp.toolFactories).map((factory) => factory()),\n resources: Object.values(mcp.resourceFactories).map((factory) => factory()),\n prompts: Object.values(mcp.promptFactories).map((factory) => factory()),\n }));\n const middlewareFactories = overrides?.middlewareFactories ?? [() => createAuthLayer(oauthAdapters.middleware), () => createLoggingLayer(logger), () => createStorageLayer({ storageDir: config.storageDir, baseUrl: config.baseUrl, transport: config.transport })];\n\n return {\n deps,\n middlewareFactories,\n createDomainModules,\n close: async () => {},\n };\n}\n"],"names":["assertStorageConfig","createAuthLayer","createDcrStore","createDefaultRuntime","createLogger","createLoggingLayer","createStorageLayer","createTokenStore","config","hasStdio","transport","type","logsPath","path","join","baseDir","name","fs","mkdirSync","dirname","recursive","pino","level","logLevel","formatters","sanitizeForLoggingFormatter","destination","dest","sync","storeUri","process","env","STORE_URI","createStore","required","dcrStoreUri","undefined","DCR_STORE_URI","authMiddleware","withTool","withToolAuth","withResource","withResourceAuth","withPrompt","withPromptAuth","logger","logging","createLoggingMiddleware","withToolLogging","withResourceLogging","withPromptLogging","storageContext","wrapAtPosition","module","extraPosition","originalHandler","handler","wrappedHandler","allArgs","extra","storageDir","Error","baseUrl","port","overrides","tokenStore","dcrStore","oauthAdapters","deps","createDomainModules","middlewareFactories","auth","createOAuthAdapters","tools","Object","values","mcp","toolFactories","map","factory","resources","resourceFactories","prompts","promptFactories","middleware","close"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/setup/runtime.ts"],"sourcesContent":["import { sanitizeForLoggingFormatter } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport type { Logger, MiddlewareLayer } from '@mcp-z/server';\nimport { createLoggingMiddleware } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport pino from 'pino';\nimport createStore from '../lib/create-store.ts';\nimport * as mcp from '../mcp/index.ts';\nimport type { CommonRuntime, RuntimeDeps, RuntimeOverrides, ServerConfig, StorageContext } from '../types.ts';\nimport { createOAuthAdapters, type OAuthAdapters } from './oauth-google.ts';\n\nexport function createLogger(config: ServerConfig): Logger {\n const hasStdio = config.transport.type === 'stdio';\n const logsPath = path.join(config.baseDir, 'logs', `${config.name}.log`);\n if (hasStdio) fs.mkdirSync(path.dirname(logsPath), { recursive: true });\n return pino({ level: config.logLevel ?? 'info', formatters: sanitizeForLoggingFormatter() }, hasStdio ? pino.destination({ dest: logsPath, sync: false }) : pino.destination(1));\n}\n\nexport async function createTokenStore(baseDir: string) {\n const storeUri = process.env.STORE_URI || `file://${path.join(baseDir, 'tokens.json')}`;\n return createStore<CachedToken>(storeUri);\n}\n\nexport async function createDcrStore(baseDir: string, required: boolean) {\n if (!required) return undefined;\n const dcrStoreUri = process.env.DCR_STORE_URI || `file://${path.join(baseDir, 'dcr.json')}`;\n return createStore<unknown>(dcrStoreUri);\n}\n\nexport function createAuthLayer(authMiddleware: OAuthAdapters['middleware']): MiddlewareLayer {\n return {\n withTool: authMiddleware.withToolAuth,\n withResource: authMiddleware.withResourceAuth,\n withPrompt: authMiddleware.withPromptAuth,\n };\n}\n\nexport function createLoggingLayer(logger: Logger): MiddlewareLayer {\n const logging = createLoggingMiddleware({ logger });\n return {\n withTool: logging.withToolLogging,\n withResource: logging.withResourceLogging,\n withPrompt: logging.withPromptLogging,\n };\n}\n\nexport function createStorageLayer(storageContext: StorageContext): MiddlewareLayer {\n const wrapAtPosition = <T extends { name: string; handler: unknown; [key: string]: unknown }>(module: T, extraPosition: number): T => {\n const originalHandler = module.handler as (...args: unknown[]) => Promise<unknown>;\n\n const wrappedHandler = async (...allArgs: unknown[]) => {\n const extra = allArgs[extraPosition];\n (extra as { storageContext?: StorageContext }).storageContext = storageContext;\n return await originalHandler(...allArgs);\n };\n\n return {\n ...module,\n handler: wrappedHandler,\n } as T;\n };\n\n return {\n withTool: <T extends { name: string; config: unknown; handler: unknown }>(module: T): T => wrapAtPosition(module, 1) as T,\n };\n}\n\nexport function assertStorageConfig(config: ServerConfig) {\n if (!config.storageDir) {\n throw new Error('gmail-messages-export-csv: Server configuration missing storageDir.');\n }\n if (config.transport.type === 'http' && !config.baseUrl && !config.transport.port) {\n throw new Error('gmail-messages-export-csv: HTTP transport requires either baseUrl in server config or port in transport config. This is a server configuration error - please provide --base-url or --port.');\n }\n}\n\nexport async function createDefaultRuntime(config: ServerConfig, overrides?: RuntimeOverrides): Promise<CommonRuntime> {\n if (config.auth === 'dcr' && config.transport.type !== 'http') throw new Error('DCR mode requires an HTTP transport');\n\n assertStorageConfig(config);\n const logger = createLogger(config);\n const tokenStore = await createTokenStore(config.baseDir);\n const baseUrl = config.baseUrl ?? (config.transport.type === 'http' && config.transport.port ? `http://localhost:${config.transport.port}` : undefined);\n const dcrStore = await createDcrStore(config.baseDir, config.auth === 'dcr');\n const oauthAdapters = await createOAuthAdapters(config, { logger, tokenStore, dcrStore }, baseUrl);\n const deps: RuntimeDeps = { config, logger, tokenStore, oauthAdapters, baseUrl };\n const createDomainModules =\n overrides?.createDomainModules ??\n (() => ({\n tools: Object.values(mcp.toolFactories).map((factory) => factory()),\n resources: Object.values(mcp.resourceFactories).map((factory) => factory()),\n prompts: Object.values(mcp.promptFactories).map((factory) => factory()),\n }));\n const middlewareFactories = overrides?.middlewareFactories ?? [() => createAuthLayer(oauthAdapters.middleware), () => createLoggingLayer(logger), () => createStorageLayer({ storageDir: config.storageDir, baseUrl: config.baseUrl, transport: config.transport })];\n\n return {\n deps,\n middlewareFactories,\n createDomainModules,\n close: async () => {},\n };\n}\n"],"names":["assertStorageConfig","createAuthLayer","createDcrStore","createDefaultRuntime","createLogger","createLoggingLayer","createStorageLayer","createTokenStore","config","hasStdio","transport","type","logsPath","path","join","baseDir","name","fs","mkdirSync","dirname","recursive","pino","level","logLevel","formatters","sanitizeForLoggingFormatter","destination","dest","sync","storeUri","process","env","STORE_URI","createStore","required","dcrStoreUri","undefined","DCR_STORE_URI","authMiddleware","withTool","withToolAuth","withResource","withResourceAuth","withPrompt","withPromptAuth","logger","logging","createLoggingMiddleware","withToolLogging","withResourceLogging","withPromptLogging","storageContext","wrapAtPosition","module","extraPosition","originalHandler","handler","wrappedHandler","allArgs","extra","storageDir","Error","baseUrl","port","overrides","tokenStore","dcrStore","oauthAdapters","deps","createDomainModules","middlewareFactories","auth","createOAuthAdapters","tools","Object","values","mcp","toolFactories","map","factory","resources","resourceFactories","prompts","promptFactories","middleware","close"],"mappings":"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"}
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "createStdioServer", {
10
10
  });
11
11
  var _server = require("@mcp-z/server");
12
12
  var _mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
13
- var _runtime = require("./runtime.js");
13
+ var _runtimets = require("./runtime.js");
14
14
  function _array_like_to_array(arr, len) {
15
15
  if (len == null || len > arr.length) len = arr.length;
16
16
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
@@ -172,7 +172,7 @@ function createStdioServer(config, overrides) {
172
172
  case 0:
173
173
  return [
174
174
  4,
175
- (0, _runtime.createDefaultRuntime)(config, overrides)
175
+ (0, _runtimets.createDefaultRuntime)(config, overrides)
176
176
  ];
177
177
  case 1:
178
178
  runtime = _state.sent();
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/setup/stdio.ts"],"sourcesContent":["import { composeMiddleware, connectStdio, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RuntimeOverrides, ServerConfig } from '../types.js';\nimport { createDefaultRuntime } from './runtime.js';\n\nexport async function createStdioServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, tools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n logger.info(`Starting ${config.name} MCP server (stdio)`);\n const { close } = await connectStdio(mcpServer, { logger });\n logger.info('stdio transport ready');\n\n return {\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["createStdioServer","config","overrides","runtime","modules","layers","composed","logger","tools","prompts","mcpServer","close","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","oauthAdapters","accountTools","accountPrompts","McpServer","name","version","registerTools","registerResources","resources","registerPrompts","info","connectStdio"],"mappings":";;;;+BAKsBA;;;eAAAA;;;sBAL6E;mBACzE;uBAEW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9B,SAAeA,kBAAkBC,MAAoB,EAAEC,SAA4B;;YAClFC,SACAC,SACAC,QACAC,UACAC,QAEAC,OACAC,SAEAC,WAMEC;;;;oBAfQ;;wBAAMC,IAAAA,6BAAoB,EAACX,QAAQC;;;oBAA7CC,UAAU;oBACVC,UAAUD,QAAQU,mBAAmB;oBACrCR,SAASF,QAAQW,mBAAmB,CAACC,GAAG,CAAC,SAACC;+BAAYA,QAAQb,QAAQc,IAAI;;oBAC1EX,WAAWY,IAAAA,yBAAiB,EAACd,SAASC;oBACtCE,SAASJ,QAAQc,IAAI,CAACV,MAAM;oBAE5BC,QAAQ,AAAC,qBAAGF,SAASE,KAAK,SAAE,qBAAGL,QAAQc,IAAI,CAACE,aAAa,CAACC,YAAY;oBACtEX,UAAU,AAAC,qBAAGH,SAASG,OAAO,SAAE,qBAAGN,QAAQc,IAAI,CAACE,aAAa,CAACE,cAAc;oBAE5EX,YAAY,IAAIY,cAAS,CAAC;wBAAEC,MAAMtB,OAAOsB,IAAI;wBAAEC,SAASvB,OAAOuB,OAAO;oBAAC;oBAC7EC,IAAAA,qBAAa,EAACf,WAAWF;oBACzBkB,IAAAA,yBAAiB,EAAChB,WAAWJ,SAASqB,SAAS;oBAC/CC,IAAAA,uBAAe,EAAClB,WAAWD;oBAE3BF,OAAOsB,IAAI,CAAC,AAAC,YAAuB,OAAZ5B,OAAOsB,IAAI,EAAC;oBAClB;;wBAAMO,IAAAA,oBAAY,EAACpB,WAAW;4BAAEH,QAAAA;wBAAO;;;oBAAjDI,QAAU,cAAVA;oBACRJ,OAAOsB,IAAI,CAAC;oBAEZ;;wBAAO;4BACLnB,WAAAA;4BACAH,QAAAA;4BACAI,OAAO;;;;;gDACL;;oDAAMA;;;gDAAN;gDACA;;oDAAMR,QAAQQ,KAAK;;;gDAAnB;;;;;;gCACF;;wBACF;;;;IACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/setup/stdio.ts"],"sourcesContent":["import { composeMiddleware, connectStdio, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createStdioServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, tools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n logger.info(`Starting ${config.name} MCP server (stdio)`);\n const { close } = await connectStdio(mcpServer, { logger });\n logger.info('stdio transport ready');\n\n return {\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["createStdioServer","config","overrides","runtime","modules","layers","composed","logger","tools","prompts","mcpServer","close","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","oauthAdapters","accountTools","accountPrompts","McpServer","name","version","registerTools","registerResources","resources","registerPrompts","info","connectStdio"],"mappings":";;;;+BAKsBA;;;eAAAA;;;sBAL6E;mBACzE;yBAEW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9B,SAAeA,kBAAkBC,MAAoB,EAAEC,SAA4B;;YAClFC,SACAC,SACAC,QACAC,UACAC,QAEAC,OACAC,SAEAC,WAMEC;;;;oBAfQ;;wBAAMC,IAAAA,+BAAoB,EAACX,QAAQC;;;oBAA7CC,UAAU;oBACVC,UAAUD,QAAQU,mBAAmB;oBACrCR,SAASF,QAAQW,mBAAmB,CAACC,GAAG,CAAC,SAACC;+BAAYA,QAAQb,QAAQc,IAAI;;oBAC1EX,WAAWY,IAAAA,yBAAiB,EAACd,SAASC;oBACtCE,SAASJ,QAAQc,IAAI,CAACV,MAAM;oBAE5BC,QAAQ,AAAC,qBAAGF,SAASE,KAAK,SAAE,qBAAGL,QAAQc,IAAI,CAACE,aAAa,CAACC,YAAY;oBACtEX,UAAU,AAAC,qBAAGH,SAASG,OAAO,SAAE,qBAAGN,QAAQc,IAAI,CAACE,aAAa,CAACE,cAAc;oBAE5EX,YAAY,IAAIY,cAAS,CAAC;wBAAEC,MAAMtB,OAAOsB,IAAI;wBAAEC,SAASvB,OAAOuB,OAAO;oBAAC;oBAC7EC,IAAAA,qBAAa,EAACf,WAAWF;oBACzBkB,IAAAA,yBAAiB,EAAChB,WAAWJ,SAASqB,SAAS;oBAC/CC,IAAAA,uBAAe,EAAClB,WAAWD;oBAE3BF,OAAOsB,IAAI,CAAC,AAAC,YAAuB,OAAZ5B,OAAOsB,IAAI,EAAC;oBAClB;;wBAAMO,IAAAA,oBAAY,EAACpB,WAAW;4BAAEH,QAAAA;wBAAO;;;oBAAjDI,QAAU,cAAVA;oBACRJ,OAAOsB,IAAI,CAAC;oBAEZ;;wBAAO;4BACLnB,WAAAA;4BACAH,QAAAA;4BACAI,OAAO;;;;;gDACL;;oDAAMA;;;gDAAN;gDACA;;oDAAMR,QAAQQ,KAAK;;;gDAAnB;;;;;;gCACF;;wBACF;;;;IACF"}
@@ -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":["EMAIL_CHUNK_SIZE","EMAIL_MAX_BATCH_SIZE","GOOGLE_SCOPE","CHUNK_SIZE","MAX_BATCH_SIZE","DEFAULT_PAGE_SIZE","MAX_PAGE_SIZE"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,gBAAgB,EAAEC,oBAAoB,QAAQ,eAAe;AAEtE,oDAAoD;AACpD,OAAO,MAAMC,eAAe,kIAAkI;AAE9J,+DAA+D;AAC/D,OAAO,MAAMC,aAAaH,iBAAiB;AAC3C,OAAO,MAAMI,iBAAiBH,qBAAqB;AAEnD,2BAA2B;AAC3B,OAAO,MAAMI,oBAAoB,GAAG,CAAC,mCAAmC;AACxE,OAAO,MAAMC,gBAAgB,KAAK,CAAC,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":["EMAIL_CHUNK_SIZE","EMAIL_MAX_BATCH_SIZE","GOOGLE_SCOPE","CHUNK_SIZE","MAX_BATCH_SIZE","DEFAULT_PAGE_SIZE","MAX_PAGE_SIZE"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,gBAAgB,EAAEC,oBAAoB,QAAQ,eAAe;AAEtE,oDAAoD;AACpD,OAAO,MAAMC,eAAe,kIAAkI;AAE9J,+DAA+D;AAC/D,OAAO,MAAMC,aAAaH,iBAAiB;AAC3C,OAAO,MAAMI,iBAAiBH,qBAAqB;AAEnD,2BAA2B;AAC3B,OAAO,MAAMI,oBAAoB,GAAG,CAAC,mCAAmC;AACxE,OAAO,MAAMC,gBAAgB,KAAK,CAAC,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":"AAWA,OAAO,SAASA,oBAAoBC,IAAgB;IAClD,MAAM,EAAEC,KAAK,EAAE,EAAEC,KAAK,EAAE,EAAEC,MAAM,EAAE,EAAEC,UAAU,EAAE,EAAEC,OAAO,EAAE,EAAEC,OAAO,EAAE,EAAEC,cAAc,MAAM,EAAE,GAAGP;IAEjG,MAAMQ,UAAoB,EAAE;IAE5B,IAAIF,MAAME,QAAQC,IAAI,CAAC,CAAC,MAAM,EAAEH,MAAM;IACtC,IAAIL,MAAMA,GAAGS,MAAM,EAAEF,QAAQC,IAAI,CAAC,CAAC,IAAI,EAAEE,MAAMC,OAAO,CAACX,MAAMA,GAAGY,IAAI,CAAC,QAAQZ,IAAI;IACjF,IAAIC,MAAMA,GAAGQ,MAAM,EAAEF,QAAQC,IAAI,CAAC,CAAC,IAAI,EAAEE,MAAMC,OAAO,CAACV,MAAMA,GAAGW,IAAI,CAAC,QAAQX,IAAI;IACjF,IAAIC,OAAOA,IAAIO,MAAM,EAAEF,QAAQC,IAAI,CAAC,CAAC,KAAK,EAAEE,MAAMC,OAAO,CAACT,OAAOA,IAAIU,IAAI,CAAC,QAAQV,KAAK;IACvF,IAAIC,SAASI,QAAQC,IAAI,CAAC,CAAC,SAAS,EAAEL,SAAS;IAE/CI,QAAQC,IAAI,CAAC;IACb,MAAMK,WAAWP,gBAAgB,SAAS,cAAc;IACxDC,QAAQC,IAAI,CAAC,CAAC,cAAc,EAAEK,SAAS,eAAe,CAAC;IAEvD,OAAO,GAAGN,QAAQK,IAAI,CAAC,QAAQ,QAAQ,EAAER,MAAM;AACjD"}
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":"AAWA,OAAO,SAASA,oBAAoBC,IAAgB;IAClD,MAAM,EAAEC,KAAK,EAAE,EAAEC,KAAK,EAAE,EAAEC,MAAM,EAAE,EAAEC,UAAU,EAAE,EAAEC,OAAO,EAAE,EAAEC,OAAO,EAAE,EAAEC,cAAc,MAAM,EAAE,GAAGP;IAEjG,MAAMQ,UAAoB,EAAE;IAE5B,IAAIF,MAAME,QAAQC,IAAI,CAAC,CAAC,MAAM,EAAEH,MAAM;IACtC,IAAIL,MAAMA,GAAGS,MAAM,EAAEF,QAAQC,IAAI,CAAC,CAAC,IAAI,EAAEE,MAAMC,OAAO,CAACX,MAAMA,GAAGY,IAAI,CAAC,QAAQZ,IAAI;IACjF,IAAIC,MAAMA,GAAGQ,MAAM,EAAEF,QAAQC,IAAI,CAAC,CAAC,IAAI,EAAEE,MAAMC,OAAO,CAACV,MAAMA,GAAGW,IAAI,CAAC,QAAQX,IAAI;IACjF,IAAIC,OAAOA,IAAIO,MAAM,EAAEF,QAAQC,IAAI,CAAC,CAAC,KAAK,EAAEE,MAAMC,OAAO,CAACT,OAAOA,IAAIU,IAAI,CAAC,QAAQV,KAAK;IACvF,IAAIC,SAASI,QAAQC,IAAI,CAAC,CAAC,SAAS,EAAEL,SAAS;IAE/CI,QAAQC,IAAI,CAAC;IACb,MAAMK,WAAWP,gBAAgB,SAAS,cAAc;IACxDC,QAAQC,IAAI,CAAC,CAAC,cAAc,EAAEK,SAAS,eAAe,CAAC;IAEvD,OAAO,GAAGN,QAAQK,IAAI,CAAC,QAAQ,QAAQ,EAAER,MAAM;AACjD"}
@@ -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":["toIsoUtc","extractEmails","extractFrom","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","fetchMessage","deps","id","mode","fromRaw","gmail","metadataHeaders","format","baseParams","userId","resp","users","messages","get","dateRaw","toRaw","ccRaw","bccRaw","fromObj","toArr","ccArr","bccArr","getId","getThreadId","threadId","getSnippet","snippet","getLabelIds","Array","isArray","labelIds","map","getPayload","msg","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":["toIsoUtc","extractEmails","extractFrom","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","fetchMessage","deps","id","mode","fromRaw","gmail","metadataHeaders","format","baseParams","userId","resp","users","messages","get","dateRaw","toRaw","ccRaw","bccRaw","fromObj","toArr","ccArr","bccArr","getId","getThreadId","threadId","getSnippet","snippet","getLabelIds","Array","isArray","labelIds","map","getPayload","msg","date","subject","to","cc","bcc","labels"],"mappings":"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"}