@mcp-z/mcp-outlook 2.2.1 → 2.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/email/composition/outlook-message-builder.js.map +1 -1
- package/dist/cjs/email/messages/messages.js.map +1 -1
- package/dist/cjs/email/parsing/header-parsing.js.map +1 -1
- package/dist/cjs/email/parsing/message-extraction.js.map +1 -1
- package/dist/cjs/email/parsing/message-mapping.js.map +1 -1
- package/dist/cjs/email/querying/client-filter.js.map +1 -1
- package/dist/cjs/email/querying/execute-query.js.map +1 -1
- package/dist/cjs/email/querying/pagination-token.js.map +1 -1
- package/dist/cjs/email/querying/query-builder.js.map +1 -1
- package/dist/cjs/email/querying/search-execution.js.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/create-store.js.map +1 -1
- package/dist/cjs/lib/messages-to-row.js.map +1 -1
- package/dist/cjs/lib/outlook/index.js.map +1 -1
- package/dist/cjs/lib/outlook/types.js.map +1 -1
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
- package/dist/cjs/mcp/prompts/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/resources/email.js.map +1 -1
- package/dist/cjs/mcp/resources/index.js.map +1 -1
- package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
- package/dist/cjs/mcp/tools/index.js.map +1 -1
- package/dist/cjs/mcp/tools/label-add.js.map +1 -1
- package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
- package/dist/cjs/mcp/tools/message-get.js.map +1 -1
- package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
- package/dist/cjs/mcp/tools/message-search.js.map +1 -1
- package/dist/cjs/mcp/tools/message-send.js.map +1 -1
- package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/cjs/schemas/index.js.map +1 -1
- package/dist/cjs/schemas/outlook-query-schema.js.map +1 -1
- package/dist/cjs/schemas/outlook-validation.js.map +1 -1
- package/dist/cjs/setup/config.js +5 -4
- package/dist/cjs/setup/config.js.map +1 -1
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/cjs/setup/index.js.map +1 -1
- package/dist/cjs/setup/oauth-microsoft.js.map +1 -1
- package/dist/cjs/setup/runtime.js +3 -2
- package/dist/cjs/setup/runtime.js.map +1 -1
- package/dist/cjs/setup/stdio.js.map +1 -1
- package/dist/cjs/setup/version-help.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/email/composition/outlook-message-builder.js.map +1 -1
- package/dist/esm/email/messages/messages.js.map +1 -1
- package/dist/esm/email/parsing/header-parsing.js.map +1 -1
- package/dist/esm/email/parsing/message-extraction.js.map +1 -1
- package/dist/esm/email/parsing/message-mapping.js.map +1 -1
- package/dist/esm/email/querying/client-filter.js.map +1 -1
- package/dist/esm/email/querying/execute-query.js.map +1 -1
- package/dist/esm/email/querying/pagination-token.js.map +1 -1
- package/dist/esm/email/querying/query-builder.js.map +1 -1
- package/dist/esm/email/querying/search-execution.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/create-store.js.map +1 -1
- package/dist/esm/lib/messages-to-row.js.map +1 -1
- package/dist/esm/lib/outlook/index.js.map +1 -1
- package/dist/esm/lib/outlook/types.js.map +1 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
- package/dist/esm/mcp/prompts/index.js.map +1 -1
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/esm/mcp/resources/email.js.map +1 -1
- package/dist/esm/mcp/resources/index.js.map +1 -1
- package/dist/esm/mcp/tools/categories-list.js.map +1 -1
- package/dist/esm/mcp/tools/index.js.map +1 -1
- package/dist/esm/mcp/tools/label-add.js.map +1 -1
- package/dist/esm/mcp/tools/label-delete.js.map +1 -1
- package/dist/esm/mcp/tools/labels-list.js.map +1 -1
- package/dist/esm/mcp/tools/message-get.js.map +1 -1
- package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/esm/mcp/tools/message-respond.js.map +1 -1
- package/dist/esm/mcp/tools/message-search.js.map +1 -1
- package/dist/esm/mcp/tools/message-send.js.map +1 -1
- package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/esm/schemas/index.js.map +1 -1
- package/dist/esm/schemas/outlook-query-schema.js.map +1 -1
- package/dist/esm/schemas/outlook-validation.js.map +1 -1
- package/dist/esm/setup/config.js +4 -3
- package/dist/esm/setup/config.js.map +1 -1
- package/dist/esm/setup/http.js.map +1 -1
- package/dist/esm/setup/index.js.map +1 -1
- package/dist/esm/setup/oauth-microsoft.js.map +1 -1
- package/dist/esm/setup/runtime.js +3 -2
- package/dist/esm/setup/runtime.js.map +1 -1
- package/dist/esm/setup/stdio.js.map +1 -1
- package/dist/esm/setup/version-help.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +6 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, defaultCacheHints, McpServer, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\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 filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n // Built per request (HTTP) and per connection (stdio), not shared. The SDK caches the\n // negotiated protocol revision on the McpServer instance - its own docs say a negotiated\n // session never re-routes a method onto the other era - so one shared instance pins itself\n // to whichever revision reaches it first and answers the other with -32601.\n const buildServer = () => {\n const mcpServer = new McpServer({ name: config.name, version: config.version }, { cacheHints: defaultCacheHints });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n return mcpServer;\n };\n\n const app = express();\n app.use(express.json({ limit: '10mb' }));\n\n // Must mount '/mcp' before any permissive app-level cors(), or that layer answers its\n // preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.\n const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(buildServer, {\n logger,\n app,\n port,\n allowedOrigins: publicUrl ? [publicUrl.origin] : undefined,\n allowedHosts: publicUrl ? [publicUrl.host] : undefined,\n });\n\n // The loopback OAuth callback, the file-export download, and the DCR discovery/\n // registration endpoints are all meant to be reached from a browser on another\n // origin. Keep cors() for them, scoped to their own routes - never in front of '/mcp'.\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n if (config.auth !== 'dcr') {\n const fileRouter = createFileServingRouter({ resourceStoreUri: config.resourceStoreUri }, { contentType: 'text/csv', contentDisposition: 'attachment' });\n app.use('/files', cors(), fileRouter);\n }\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info('http transport ready');\n\n return {\n httpServer,\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","filteredTools","prompts","buildServer","app","publicUrl","close","httpServer","fileRouter","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","transport","Error","oauthAdapters","accountTools","auth","filter","tool","name","accountPrompts","mcpServer","McpServer","version","cacheHints","defaultCacheHints","registerTools","registerResources","resources","registerPrompts","express","use","json","limit","baseUrl","URL","undefined","info","connectHttp","allowedOrigins","origin","allowedHosts","host","loopbackRouter","cors","createFileServingRouter","resourceStoreUri","contentType","contentDisposition","dcrRouter"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/setup/index.ts"],"sourcesContent":["export { createConfig, parseConfig } from './config.ts';\nexport { createHTTPServer } from './http.ts';\nexport { createOAuthAdapters } from './oauth-microsoft.ts';\nexport * from './runtime.ts';\nexport { createStdioServer } from './stdio.ts';\n"],"names":["createConfig","createHTTPServer","createOAuthAdapters","createStdioServer","parseConfig"],"mappings":";;;;;;;;;;;QAASA;eAAAA,sBAAY;;QACZC;eAAAA,wBAAgB;;QAChBC;eAAAA,qCAAmB;;QAEnBC;eAAAA,0BAAiB;;QAJHC;eAAAA,qBAAW;;;wBAAQ;sBACT;gCACG;qBACtB;uBACoB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/setup/oauth-microsoft.ts"],"sourcesContent":["import { type AccountAuthProvider, AccountServer } from '@mcp-z/oauth';\nimport { createDcrRouter, createLoopbackCallbackRouter, DcrOAuthProvider, DeviceCodeProvider, LoopbackOAuthProvider } from '@mcp-z/oauth-microsoft';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { MS_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\n/**\n * Outlook OAuth runtime dependencies\n *\n * Contains the required dependencies for OAuth functionality including logger,\n * token storage, and optional DCR store.\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<unknown>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods\n *\n * Provides authentication middleware methods for tools, resources, and prompts.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends ToolModule>(module: T): T;\n withResourceAuth<T>(module: T): T;\n withPromptAuth<T>(module: T): T;\n}\n\n/**\n * Result of OAuth adapter creation\n *\n * Contains the primary OAuth adapter, middleware, auth adapter,\n * account tools, prompts, and optional routers.\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AccountAuthProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router; // DCR OAuth endpoints (only for dcr mode)\n loopbackRouter?: Router;\n}\n\n/**\n * Create Outlook OAuth adapters based on transport configuration\n *\n * Returns primary adapter, pre-configured middleware, auth email provider,\n * and pre-selected account tools based on auth mode.\n * @param config - Outlook server configuration\n * @param deps - Runtime dependencies (logger, tokenStore, etc.)\n * @returns OAuth adapters with pre-configured middleware and account tools\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: MS_SCOPE,\n tenantId: config.tenantId,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n\n // DCR mode - Dynamic Client Registration with HTTP-only support\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n // DCR requires dcrStore and baseUrl\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 // Create DcrOAuthProvider (stateless provider that receives tokens from verification context)\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n // Create DCR OAuth router with authorization server endpoints\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '), // Convert space-separated scope to array\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n },\n });\n\n // DCR uses bearer token authentication with middleware validation\n const middleware = primary.authMiddleware();\n\n // Create auth email provider (stateless, no token storage)\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 // No account management tools for DCR (multi-user management at client registration level)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('DCR provider created for Outlook', {\n service: oauthStaticConfig.service,\n baseUrl: oauthStaticConfig.baseUrl,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, dcrRouter };\n }\n\n // Device code mode - similar to service accounts (single static identity)\n if (oauthStaticConfig.auth === 'device-code') {\n logger.debug('Creating device code provider', { service: oauthStaticConfig.service });\n const deviceCodeProvider = new DeviceCodeProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n logger,\n tokenStore,\n headless: oauthStaticConfig.headless,\n });\n primary = deviceCodeProvider;\n\n // Device code uses single-user middleware (no account management needed)\n const middleware = deviceCodeProvider.authMiddleware();\n\n // Create auth email provider\n const authAdapter: AccountAuthProvider = {\n getAccessToken: (accountId) => deviceCodeProvider.getAccessToken(accountId),\n getUserEmail: (accountId) => deviceCodeProvider.getUserEmail(accountId),\n };\n\n // No account management tools for device code (like service accounts)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('Device code provider created for Outlook', {\n service: oauthStaticConfig.service,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts };\n }\n\n // Always create primary adapter for file-based OAuth (loopback mode)\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n tenantId: oauthStaticConfig.tenantId,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n\n // Create auth email provider (used by account management tools)\n const authAdapter: AccountAuthProvider = primary;\n\n // Select middleware AND account tools based on auth mode\n const middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']> = primary.authMiddleware();\n\n // Loopback OAuth - multi-account mode\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n const accountTools: ToolModule[] = result.tools as ToolModule[];\n const accountPrompts: PromptModule[] = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n\n const loopbackRouter = oauthStaticConfig.redirectUri ? createLoopbackCallbackRouter(primary) : undefined;\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, loopbackRouter };\n}\n"],"names":["createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","primary","dcrRouter","middleware","authAdapter","accountTools","accountPrompts","deviceCodeProvider","result","loopbackRouter","service","name","clientId","clientSecret","scope","MS_SCOPE","tenantId","auth","headless","redirectUri","transport","type","undefined","debug","Error","DcrOAuthProvider","verifyEndpoint","createDcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","authMiddleware","getAccessToken","getUserEmail","info","DeviceCodeProvider","accountId","LoopbackOAuthProvider","AccountServer","createLoopback","tools","prompts","createLoopbackCallbackRouter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/setup/oauth-microsoft.ts"],"sourcesContent":["import { type AccountAuthProvider, AccountServer } from '@mcp-z/oauth';\nimport { createDcrRouter, createLoopbackCallbackRouter, DcrOAuthProvider, DeviceCodeProvider, LoopbackOAuthProvider } from '@mcp-z/oauth-microsoft';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { MS_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\n/**\n * Outlook OAuth runtime dependencies\n *\n * Contains the required dependencies for OAuth functionality including logger,\n * token storage, and optional DCR store.\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<unknown>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods\n *\n * Provides authentication middleware methods for tools, resources, and prompts.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends ToolModule>(module: T): T;\n withResourceAuth<T>(module: T): T;\n withPromptAuth<T>(module: T): T;\n}\n\n/**\n * Result of OAuth adapter creation\n *\n * Contains the primary OAuth adapter, middleware, auth adapter,\n * account tools, prompts, and optional routers.\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AccountAuthProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router; // DCR OAuth endpoints (only for dcr mode)\n loopbackRouter?: Router;\n}\n\n/**\n * Create Outlook OAuth adapters based on transport configuration\n *\n * Returns primary adapter, pre-configured middleware, auth email provider,\n * and pre-selected account tools based on auth mode.\n * @param config - Outlook server configuration\n * @param deps - Runtime dependencies (logger, tokenStore, etc.)\n * @returns OAuth adapters with pre-configured middleware and account tools\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: MS_SCOPE,\n tenantId: config.tenantId,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n\n // DCR mode - Dynamic Client Registration with HTTP-only support\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n // DCR requires dcrStore and baseUrl\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 // Create DcrOAuthProvider (stateless provider that receives tokens from verification context)\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n // Create DCR OAuth router with authorization server endpoints\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '), // Convert space-separated scope to array\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n },\n });\n\n // DCR uses bearer token authentication with middleware validation\n const middleware = primary.authMiddleware();\n\n // Create auth email provider (stateless, no token storage)\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 // No account management tools for DCR (multi-user management at client registration level)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('DCR provider created for Outlook', {\n service: oauthStaticConfig.service,\n baseUrl: oauthStaticConfig.baseUrl,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, dcrRouter };\n }\n\n // Device code mode - similar to service accounts (single static identity)\n if (oauthStaticConfig.auth === 'device-code') {\n logger.debug('Creating device code provider', { service: oauthStaticConfig.service });\n const deviceCodeProvider = new DeviceCodeProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n logger,\n tokenStore,\n headless: oauthStaticConfig.headless,\n });\n primary = deviceCodeProvider;\n\n // Device code uses single-user middleware (no account management needed)\n const middleware = deviceCodeProvider.authMiddleware();\n\n // Create auth email provider\n const authAdapter: AccountAuthProvider = {\n getAccessToken: (accountId) => deviceCodeProvider.getAccessToken(accountId),\n getUserEmail: (accountId) => deviceCodeProvider.getUserEmail(accountId),\n };\n\n // No account management tools for device code (like service accounts)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('Device code provider created for Outlook', {\n service: oauthStaticConfig.service,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts };\n }\n\n // Always create primary adapter for file-based OAuth (loopback mode)\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n tenantId: oauthStaticConfig.tenantId,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n\n // Create auth email provider (used by account management tools)\n const authAdapter: AccountAuthProvider = primary;\n\n // Select middleware AND account tools based on auth mode\n const middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']> = primary.authMiddleware();\n\n // Loopback OAuth - multi-account mode\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n const accountTools: ToolModule[] = result.tools as ToolModule[];\n const accountPrompts: PromptModule[] = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n\n const loopbackRouter = oauthStaticConfig.redirectUri ? createLoopbackCallbackRouter(primary) : undefined;\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, loopbackRouter };\n}\n"],"names":["createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","primary","dcrRouter","middleware","authAdapter","accountTools","accountPrompts","deviceCodeProvider","result","loopbackRouter","service","name","clientId","clientSecret","scope","MS_SCOPE","tenantId","auth","headless","redirectUri","transport","type","undefined","debug","Error","DcrOAuthProvider","verifyEndpoint","createDcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","authMiddleware","getAccessToken","getUserEmail","info","DeviceCodeProvider","accountId","LoopbackOAuthProvider","AccountServer","createLoopback","tools","prompts","createLoopbackCallbackRouter"],"mappings":"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"}
|
|
@@ -34,6 +34,7 @@ _export(exports, {
|
|
|
34
34
|
return validateStorageConfig;
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
|
+
var _nodeurl = require("node:url");
|
|
37
38
|
var _oauth = require("@mcp-z/oauth");
|
|
38
39
|
var _server = require("@mcp-z/server");
|
|
39
40
|
var _fs = /*#__PURE__*/ _interop_require_wildcard(require("fs"));
|
|
@@ -297,7 +298,7 @@ function createTokenStore(baseDir) {
|
|
|
297
298
|
return _async_to_generator(function() {
|
|
298
299
|
var tokenStoreUri;
|
|
299
300
|
return _ts_generator(this, function(_state) {
|
|
300
|
-
tokenStoreUri = process.env.TOKEN_STORE_URI ||
|
|
301
|
+
tokenStoreUri = process.env.TOKEN_STORE_URI || (0, _nodeurl.pathToFileURL)(_path.join(baseDir, 'tokens.json')).href;
|
|
301
302
|
return [
|
|
302
303
|
2,
|
|
303
304
|
(0, _createstorets.default)(tokenStoreUri)
|
|
@@ -313,7 +314,7 @@ function createDcrStore(baseDir, required) {
|
|
|
313
314
|
2,
|
|
314
315
|
undefined
|
|
315
316
|
];
|
|
316
|
-
dcrStoreUri = process.env.DCR_STORE_URI ||
|
|
317
|
+
dcrStoreUri = process.env.DCR_STORE_URI || (0, _nodeurl.pathToFileURL)(_path.join(baseDir, 'dcr.json')).href;
|
|
317
318
|
return [
|
|
318
319
|
2,
|
|
319
320
|
(0, _createstorets.default)(dcrStoreUri)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/setup/runtime.ts"],"sourcesContent":["import { sanitizeForLoggingFormatter } from '@mcp-z/oauth';\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-microsoft.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 tokenStoreUri = process.env.TOKEN_STORE_URI || `file://${path.join(baseDir, 'tokens.json')}`;\n return createStore<unknown>(tokenStoreUri);\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 validateStorageConfig(config: ServerConfig, logger: Logger) {\n if (config.auth === 'dcr') {\n if (config.resourceStoreUri) {\n logger.warn('DCR mode does not support file storage; resourceStoreUri will be ignored.');\n }\n return;\n }\n if (!config.resourceStoreUri) {\n throw new Error('outlook-messages-export-csv: Server configuration missing resourceStoreUri.');\n }\n if (config.transport.type === 'http' && !config.baseUrl && !config.transport.port) {\n throw new Error('outlook-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 const logger = createLogger(config);\n validateStorageConfig(config, logger);\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), ...(config.auth === 'dcr' ? [] : [() => createStorageLayer({ resourceStoreUri: config.resourceStoreUri, baseUrl: config.baseUrl, transport: config.transport })])];\n\n return {\n deps,\n middlewareFactories,\n createDomainModules,\n close: async () => {},\n };\n}\n"],"names":["createAuthLayer","createDcrStore","createDefaultRuntime","createLogger","createLoggingLayer","createStorageLayer","createTokenStore","validateStorageConfig","config","hasStdio","transport","type","logsPath","path","join","baseDir","name","fs","mkdirSync","dirname","recursive","pino","level","logLevel","formatters","sanitizeForLoggingFormatter","destination","dest","sync","tokenStoreUri","process","env","TOKEN_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","auth","resourceStoreUri","warn","Error","baseUrl","port","overrides","tokenStore","dcrStore","oauthAdapters","deps","createDomainModules","middlewareFactories","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/open-source/ai/mcp-z/mcp-outlook/src/setup/runtime.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url';\nimport { sanitizeForLoggingFormatter } from '@mcp-z/oauth';\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-microsoft.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 tokenStoreUri = process.env.TOKEN_STORE_URI || pathToFileURL(path.join(baseDir, 'tokens.json')).href;\n return createStore<unknown>(tokenStoreUri);\n}\n\nexport async function createDcrStore(baseDir: string, required: boolean) {\n if (!required) return undefined;\n const dcrStoreUri = process.env.DCR_STORE_URI || pathToFileURL(path.join(baseDir, 'dcr.json')).href;\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 validateStorageConfig(config: ServerConfig, logger: Logger) {\n if (config.auth === 'dcr') {\n if (config.resourceStoreUri) {\n logger.warn('DCR mode does not support file storage; resourceStoreUri will be ignored.');\n }\n return;\n }\n if (!config.resourceStoreUri) {\n throw new Error('outlook-messages-export-csv: Server configuration missing resourceStoreUri.');\n }\n if (config.transport.type === 'http' && !config.baseUrl && !config.transport.port) {\n throw new Error('outlook-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 const logger = createLogger(config);\n validateStorageConfig(config, logger);\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), ...(config.auth === 'dcr' ? [] : [() => createStorageLayer({ resourceStoreUri: config.resourceStoreUri, baseUrl: config.baseUrl, transport: config.transport })])];\n\n return {\n deps,\n middlewareFactories,\n createDomainModules,\n close: async () => {},\n };\n}\n"],"names":["createAuthLayer","createDcrStore","createDefaultRuntime","createLogger","createLoggingLayer","createStorageLayer","createTokenStore","validateStorageConfig","config","hasStdio","transport","type","logsPath","path","join","baseDir","name","fs","mkdirSync","dirname","recursive","pino","level","logLevel","formatters","sanitizeForLoggingFormatter","destination","dest","sync","tokenStoreUri","process","env","TOKEN_STORE_URI","pathToFileURL","href","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","auth","resourceStoreUri","warn","Error","baseUrl","port","overrides","tokenStore","dcrStore","oauthAdapters","deps","createDomainModules","middlewareFactories","createOAuthAdapters","tools","Object","values","mcp","toolFactories","map","factory","resources","resourceFactories","prompts","promptFactories","middleware","close"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/setup/stdio.ts"],"sourcesContent":["import { composeMiddleware, connectStdio, defaultCacheHints, McpServer, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\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 filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n // Built per request (HTTP) and per connection (stdio), not shared. The SDK caches the\n // negotiated protocol revision on the McpServer instance - its own docs say a negotiated\n // session never re-routes a method onto the other era - so one shared instance pins itself\n // to whichever revision reaches it first and answers the other with -32601.\n const buildServer = () => {\n const mcpServer = new McpServer({ name: config.name, version: config.version }, { cacheHints: defaultCacheHints });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n return mcpServer;\n };\n\n logger.info(`Starting ${config.name} MCP server (stdio)`);\n const { close } = await connectStdio(buildServer, { logger });\n logger.info('stdio transport ready');\n\n return {\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","filteredTools","prompts","buildServer","close","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","oauthAdapters","accountTools","auth","filter","tool","name","accountPrompts","mcpServer","McpServer","version","cacheHints","defaultCacheHints","registerTools","registerResources","resources","registerPrompts","info","connectStdio"],"mappings":";;;;+BAIsBA;;;eAAAA;;;sBAJ2G;yBAE5F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9B,SAAeA,kBAAkBC,MAAoB,EAAEC,SAA4B;;YAClFC,SACAC,SACAC,QACAC,UACAC,QAEAC,OACAC,eAIAC,SAMAC,aASEC;;;;oBA1BQ;;wBAAMC,IAAAA,+BAAoB,EAACZ,QAAQC;;;oBAA7CC,UAAU;oBACVC,UAAUD,QAAQW,mBAAmB;oBACrCT,SAASF,QAAQY,mBAAmB,CAACC,GAAG,CAAC,SAACC;+BAAYA,QAAQd,QAAQe,IAAI;;oBAC1EZ,WAAWa,IAAAA,yBAAiB,EAACf,SAASC;oBACtCE,SAASJ,QAAQe,IAAI,CAACX,MAAM;oBAE5BC,QAAQ,AAAC,qBAAGF,SAASE,KAAK,SAAE,qBAAGL,QAAQe,IAAI,CAACE,aAAa,CAACC,YAAY;oBACtEZ,gBACJR,OAAOqB,IAAI,KAAK,QACZd,MAAMe,MAAM,CAAC,SAACC;+BAASA,KAAKC,IAAI,KAAK;uBAAuB,uDAAuD;uBACnHjB;oBACAE,UAAU,AAAC,qBAAGJ,SAASI,OAAO,SAAE,qBAAGP,QAAQe,IAAI,CAACE,aAAa,CAACM,cAAc;oBAElF,sFAAsF;oBACtF,yFAAyF;oBACzF,2FAA2F;oBAC3F,4EAA4E;oBACtEf,cAAc;wBAClB,IAAMgB,YAAY,IAAIC,iBAAS,CAAC;4BAAEH,MAAMxB,OAAOwB,IAAI;4BAAEI,SAAS5B,OAAO4B,OAAO;wBAAC,GAAG;4BAAEC,YAAYC,yBAAiB;wBAAC;wBAChHC,IAAAA,qBAAa,EAACL,WAAWlB;wBACzBwB,IAAAA,yBAAiB,EAACN,WAAWrB,SAAS4B,SAAS;wBAC/CC,IAAAA,uBAAe,EAACR,WAAWjB;wBAC3B,OAAOiB;oBACT;oBAEApB,OAAO6B,IAAI,CAAC,AAAC,YAAuB,OAAZnC,OAAOwB,IAAI,EAAC;oBAClB;;wBAAMY,IAAAA,oBAAY,EAAC1B,aAAa;4BAAEJ,QAAAA;wBAAO;;;oBAAnDK,QAAU,cAAVA;oBACRL,OAAO6B,IAAI,CAAC;oBAEZ;;wBAAO;4BACL7B,QAAAA;4BACAK,OAAO,SAAPA;;;;;gDACE;;oDAAMA;;;gDAAN;gDACA;;oDAAMT,QAAQS,KAAK;;;gDAAnB;;;;;;gCACF;;wBACF;;;;IACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/setup/version-help.ts"],"sourcesContent":["import * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { parseArgs } from 'util';\n\n// Kept dependency-free (fs/path/url/module-root-sync only) so `--version`/`--help`\n// resolve nothing beyond Node startup: config.ts's parseConfig pulls in @mcp-z/oauth-microsoft\n// and @mcp-z/server, which this path must not touch.\nconst pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));\n\nconst HELP_TEXT = `\nUsage: mcp-outlook [options]\n\nMCP server for Outlook/Microsoft 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, device-code, dcr\n --headless Disable browser auto-open, return auth URL instead\n --redirect-uri=<uri> OAuth redirect URI (default: ephemeral loopback)\n --tenant-id=<id> Microsoft tenant ID (overrides MS_TENANT_ID env var)\n --dcr-mode=<mode> DCR mode (self-hosted or external, default: self-hosted)\n --dcr-verify-url=<url> External verification endpoint (required for external mode)\n --dcr-store-uri=<uri> DCR client storage URI (required for self-hosted mode)\n --port=<port> Enable HTTP transport on specified port\n --stdio Enable stdio transport (default if no port)\n --log-level=<level> Logging level (default: info)\n --resource-store-uri=<uri> Resource store URI for CSV file storage (default: file://~/.mcp-z/mcp-outlook/files)\n --base-url=<url> Base URL for HTTP file serving (default: http://localhost for HTTP transports)\n\nEnvironment Variables:\n MS_CLIENT_ID OAuth client ID (REQUIRED)\n MS_TENANT_ID Microsoft tenant ID (REQUIRED)\n MS_CLIENT_SECRET OAuth client secret (optional)\n AUTH_MODE Default authentication mode (optional)\n HEADLESS Disable browser auto-open (optional)\n DCR_MODE DCR mode (optional, same format as --dcr-mode)\n DCR_VERIFY_URL External verification URL (optional, same as --dcr-verify-url)\n DCR_STORE_URI DCR storage URI (optional, same as --dcr-store-uri)\n TOKEN_STORE_URI Token storage URI (optional)\n PORT Default HTTP port (optional)\n LOG_LEVEL Default logging level (optional)\n RESOURCE_STORE_URI Resource store URI (optional, file://)\n BASE_URL Base URL for HTTP file serving (optional)\n\nStorage Backends:\n TOKEN_STORE_URI and DCR_STORE_URI accept any keyv-registry protocol.\n file:// (the default) and memory:// work out of the box. Any other backend\n needs its adapter installed alongside this server:\n npm install -g @keyv/redis\n TOKEN_STORE_URI=redis://localhost:6379 mcp-outlook\n\nOAuth Scopes:\n openid profile offline_access https://graph.microsoft.com/User.Read https://graph.microsoft.com/Mail.ReadWrite https://graph.microsoft.com/Mail.Send https://graph.microsoft.com/MailboxSettings.ReadWrite\n\nExamples:\n mcp-outlook # Use default settings\n mcp-outlook --auth=device-code # Use device code auth\n mcp-outlook --port=3000 # HTTP transport on port 3000\n mcp-outlook --tenant-id=xxx # Set tenant ID\n mcp-outlook --resource-store-uri=file:///tmp/emails # Custom resource store URI\n MS_CLIENT_ID=xxx mcp-outlook # Set client ID via env var\n`.trim();\n\n/** Package metadata read from package.json, resolved relative to this file. */\nexport function readPkg(): { name: string; version: string; repository?: string | { url?: string } } {\n return pkg;\n}\n\n/**\n * Handle --version/--help flags before config parsing.\n * These must work without requiring any configuration or heavy dependency.\n */\nexport function handleVersionHelp(args: string[]): { handled: boolean; output?: string } {\n const { values } = parseArgs({\n args,\n options: {\n version: { type: 'boolean', short: 'v' },\n help: { type: 'boolean', short: 'h' },\n },\n strict: false,\n allowPositionals: true,\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"],"names":["handleVersionHelp","readPkg","pkg","JSON","parse","fs","readFileSync","path","join","moduleRoot","url","fileURLToPath","HELP_TEXT","trim","args","values","parseArgs","options","version","type","short","help","strict","allowPositionals","handled","output"],"mappings":";;;;;;;;;;;QA4EgBA;eAAAA;;QARAC;eAAAA;;;0DApEI;qEACG;4DACD;2DACD;oBACK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE1B,mFAAmF;AACnF,+FAA+F;AAC/F,qDAAqD;AACrD,IAAMC,MAAMC,KAAKC,KAAK,CAACC,IAAGC,YAAY,CAACC,MAAKC,IAAI,CAACC,IAAAA,uBAAU,EAACC,KAAIC,aAAa,CAAC,uDAAmB,iBAAiB;AAElH,IAAMC,YAAY,8gGAsDhBC,IAAI;AAGC,SAASZ;IACd,OAAOC;AACT;AAMO,SAASF,kBAAkBc,IAAc;IAC9C,IAAM,AAAEC,SAAWC,IAAAA,eAAS,EAAC;QAC3BF,MAAAA;QACAG,SAAS;YACPC,SAAS;gBAAEC,MAAM;gBAAWC,OAAO;YAAI;YACvCC,MAAM;gBAAEF,MAAM;gBAAWC,OAAO;YAAI;QACtC;QACAE,QAAQ;QACRC,kBAAkB;IACpB,GARQR;IAUR,IAAIA,OAAOG,OAAO,EAAE,OAAO;QAAEM,SAAS;QAAMC,QAAQvB,IAAIgB,OAAO;IAAC;IAChE,IAAIH,OAAOM,IAAI,EAAE,OAAO;QAAEG,SAAS;QAAMC,QAAQb;IAAU;IAC3D,OAAO;QAAEY,SAAS;IAAM;AAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/constants.ts"],"sourcesContent":["/**\n * Outlook MCP Server Constants\n *\n * These scopes are required for Microsoft Outlook 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// Microsoft OAuth scopes required for Outlook operations\nexport const MS_SCOPE = 'openid profile offline_access https://graph.microsoft.com/User.Read https://graph.microsoft.com/Mail.ReadWrite https://graph.microsoft.com/Mail.Send https://graph.microsoft.com/MailboxSettings.ReadWrite';\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 MAX_PAGE_SIZE = 1000; // Maximum number of items per page\n"],"names":["EMAIL_CHUNK_SIZE","EMAIL_MAX_BATCH_SIZE","MS_SCOPE","CHUNK_SIZE","MAX_BATCH_SIZE","MAX_PAGE_SIZE"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,gBAAgB,EAAEC,oBAAoB,QAAQ,eAAe;AAEtE,yDAAyD;AACzD,OAAO,MAAMC,WAAW,6MAA6M;AAErO,+DAA+D;AAC/D,OAAO,MAAMC,aAAaH,iBAAiB;AAC3C,OAAO,MAAMI,iBAAiBH,qBAAqB;AAEnD,2BAA2B;AAC3B,OAAO,MAAMI,gBAAgB,KAAK,CAAC,mCAAmC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/composition/outlook-message-builder.ts"],"sourcesContent":["/**\n * Outlook-specific message builder for composing emails using Microsoft Graph API format\n * This is the Outlook equivalent of Gmail's RFC822 builder\n */\n\nexport interface OutlookRecipient {\n emailAddress: {\n address: string;\n name?: string;\n };\n}\n\nexport interface OutlookMessageArgs {\n to?: string | string[] | undefined;\n cc?: string | string[] | undefined;\n bcc?: string | string[] | undefined;\n subject?: string;\n body?: string;\n from?: string;\n importance?: 'Low' | 'Normal' | 'High';\n contentType?: 'Text' | 'HTML';\n}\n\nexport interface OutlookMessage {\n subject?: string;\n body?: {\n contentType: string;\n content: string;\n };\n toRecipients?: OutlookRecipient[];\n ccRecipients?: OutlookRecipient[];\n bccRecipients?: OutlookRecipient[];\n importance?: string;\n}\n\n/**\n * Build an Outlook message object from email arguments for Microsoft Graph API\n * This is the Outlook equivalent of buildRfc822FromArgs for Gmail\n */\nexport function buildOutlookMessage(args: OutlookMessageArgs): OutlookMessage {\n const { to = [], cc = [], bcc = [], subject = '', body = '', importance = 'Normal', contentType = 'Text' } = args;\n\n const message: OutlookMessage = {};\n\n if (subject) {\n message.subject = subject;\n }\n\n if (body) {\n message.body = {\n contentType: contentType,\n content: body,\n };\n }\n\n function parseEmailAddresses(emails: string | string[]): OutlookRecipient[] {\n const emailArray = Array.isArray(emails) ? emails : [emails];\n return emailArray\n .filter((email) => email && email.trim())\n .map((email) => {\n const trimmed = email.trim();\n // Simple email parsing - could be enhanced for name parsing\n return {\n emailAddress: {\n address: trimmed,\n },\n };\n });\n }\n\n if (to && (Array.isArray(to) ? to.length > 0 : to.trim())) {\n message.toRecipients = parseEmailAddresses(to);\n }\n\n if (cc && (Array.isArray(cc) ? cc.length > 0 : cc.trim())) {\n message.ccRecipients = parseEmailAddresses(cc);\n }\n\n if (bcc && (Array.isArray(bcc) ? bcc.length > 0 : bcc.trim())) {\n message.bccRecipients = parseEmailAddresses(bcc);\n }\n\n if (importance && importance !== 'Normal') {\n message.importance = importance;\n }\n\n return message;\n}\n"],"names":["buildOutlookMessage","args","to","cc","bcc","subject","body","importance","contentType","message","content","parseEmailAddresses","emails","emailArray","Array","isArray","filter","email","trim","map","trimmed","emailAddress","address","length","toRecipients","ccRecipients","bccRecipients"],"mappings":"AAAA;;;CAGC,GAgCD;;;CAGC,GACD,OAAO,SAASA,oBAAoBC,IAAwB;IAC1D,MAAM,EAAEC,KAAK,EAAE,EAAEC,KAAK,EAAE,EAAEC,MAAM,EAAE,EAAEC,UAAU,EAAE,EAAEC,OAAO,EAAE,EAAEC,aAAa,QAAQ,EAAEC,cAAc,MAAM,EAAE,GAAGP;IAE7G,MAAMQ,UAA0B,CAAC;IAEjC,IAAIJ,SAAS;QACXI,QAAQJ,OAAO,GAAGA;IACpB;IAEA,IAAIC,MAAM;QACRG,QAAQH,IAAI,GAAG;YACbE,aAAaA;YACbE,SAASJ;QACX;IACF;IAEA,SAASK,oBAAoBC,MAAyB;QACpD,MAAMC,aAAaC,MAAMC,OAAO,CAACH,UAAUA,SAAS;YAACA;SAAO;QAC5D,OAAOC,WACJG,MAAM,CAAC,CAACC,QAAUA,SAASA,MAAMC,IAAI,IACrCC,GAAG,CAAC,CAACF;YACJ,MAAMG,UAAUH,MAAMC,IAAI;YAC1B,4DAA4D;YAC5D,OAAO;gBACLG,cAAc;oBACZC,SAASF;gBACX;YACF;QACF;IACJ;IAEA,IAAIlB,MAAOY,CAAAA,MAAMC,OAAO,CAACb,MAAMA,GAAGqB,MAAM,GAAG,IAAIrB,GAAGgB,IAAI,EAAC,GAAI;QACzDT,QAAQe,YAAY,GAAGb,oBAAoBT;IAC7C;IAEA,IAAIC,MAAOW,CAAAA,MAAMC,OAAO,CAACZ,MAAMA,GAAGoB,MAAM,GAAG,IAAIpB,GAAGe,IAAI,EAAC,GAAI;QACzDT,QAAQgB,YAAY,GAAGd,oBAAoBR;IAC7C;IAEA,IAAIC,OAAQU,CAAAA,MAAMC,OAAO,CAACX,OAAOA,IAAImB,MAAM,GAAG,IAAInB,IAAIc,IAAI,EAAC,GAAI;QAC7DT,QAAQiB,aAAa,GAAGf,oBAAoBP;IAC9C;IAEA,IAAIG,cAAcA,eAAe,UAAU;QACzCE,QAAQF,UAAU,GAAGA;IACvB;IAEA,OAAOE;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/messages/messages.ts"],"sourcesContent":["import { buildContentForItems, stripHtml, normalizeDateToISO as toIsoUtc } from '@mcp-z/email';\nimport type { OutlookMessage } from '../../lib/outlook/types.ts';\nimport { extractFrom, formatAddressList } from '../parsing/header-parsing.ts';\n\nexport { buildContentForItems };\n\nexport function toRowFromOutlook(msg: OutlookMessage, opts: { body?: boolean; addressFormat?: 'email' | 'name' | 'raw' } = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = 'outlook';\n const threadId = msg.conversationId ?? '';\n const to = msg.toRecipients ? formatAddressList(msg.toRecipients, opts.addressFormat) : '';\n const from = msg.from ? (extractFrom(msg.from) ?? '') : '';\n const cc = msg.ccRecipients ? formatAddressList(msg.ccRecipients, opts.addressFormat) : '';\n const bcc = msg.bccRecipients ? formatAddressList(msg.bccRecipients, opts.addressFormat) : '';\n const date = msg.receivedDateTime ? toIsoUtc(msg.receivedDateTime) || msg.receivedDateTime : '';\n const subject = msg.subject ?? '';\n const labels = msg.categories ? msg.categories.join(';') : '';\n const snippet = msg.bodyPreview ?? '';\n let bodyFull = '';\n if (opts.body && msg.body) {\n const raw = msg.body.content ?? '';\n if (raw) {\n bodyFull = msg.body.contentType && msg.body.contentType.toLowerCase() === 'html' ? stripHtml(raw) : String(raw);\n }\n }\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, bodyFull];\n}\n"],"names":["buildContentForItems","stripHtml","normalizeDateToISO","toIsoUtc","extractFrom","formatAddressList","toRowFromOutlook","msg","opts","body","addressFormat","id","provider","threadId","conversationId","to","toRecipients","from","cc","ccRecipients","bcc","bccRecipients","date","receivedDateTime","subject","labels","categories","join","snippet","bodyPreview","bodyFull","raw","content","contentType","toLowerCase","String"],"mappings":"AAAA,SAASA,oBAAoB,EAAEC,SAAS,EAAEC,sBAAsBC,QAAQ,QAAQ,eAAe;AAE/F,SAASC,WAAW,EAAEC,iBAAiB,QAAQ,+BAA+B;AAE9E,SAASL,oBAAoB,GAAG;AAEhC,OAAO,SAASM,iBAAiBC,GAAmB,EAAEC,OAAqE;IAAEC,MAAM;IAAOC,eAAe;AAAQ,CAAC;QACrJH,SAEMA,qBAEQH,cAITG,cAEAA;IAVhB,MAAMI,MAAKJ,UAAAA,IAAII,EAAE,cAANJ,qBAAAA,UAAU;IACrB,MAAMK,WAAW;IACjB,MAAMC,YAAWN,sBAAAA,IAAIO,cAAc,cAAlBP,iCAAAA,sBAAsB;IACvC,MAAMQ,KAAKR,IAAIS,YAAY,GAAGX,kBAAkBE,IAAIS,YAAY,EAAER,KAAKE,aAAa,IAAI;IACxF,MAAMO,OAAOV,IAAIU,IAAI,IAAIb,eAAAA,YAAYG,IAAIU,IAAI,eAApBb,0BAAAA,eAAyB,KAAM;IACxD,MAAMc,KAAKX,IAAIY,YAAY,GAAGd,kBAAkBE,IAAIY,YAAY,EAAEX,KAAKE,aAAa,IAAI;IACxF,MAAMU,MAAMb,IAAIc,aAAa,GAAGhB,kBAAkBE,IAAIc,aAAa,EAAEb,KAAKE,aAAa,IAAI;IAC3F,MAAMY,OAAOf,IAAIgB,gBAAgB,GAAGpB,SAASI,IAAIgB,gBAAgB,KAAKhB,IAAIgB,gBAAgB,GAAG;IAC7F,MAAMC,WAAUjB,eAAAA,IAAIiB,OAAO,cAAXjB,0BAAAA,eAAe;IAC/B,MAAMkB,SAASlB,IAAImB,UAAU,GAAGnB,IAAImB,UAAU,CAACC,IAAI,CAAC,OAAO;IAC3D,MAAMC,WAAUrB,mBAAAA,IAAIsB,WAAW,cAAftB,8BAAAA,mBAAmB;IACnC,IAAIuB,WAAW;IACf,IAAItB,KAAKC,IAAI,IAAIF,IAAIE,IAAI,EAAE;YACbF;QAAZ,MAAMwB,OAAMxB,oBAAAA,IAAIE,IAAI,CAACuB,OAAO,cAAhBzB,+BAAAA,oBAAoB;QAChC,IAAIwB,KAAK;YACPD,WAAWvB,IAAIE,IAAI,CAACwB,WAAW,IAAI1B,IAAIE,IAAI,CAACwB,WAAW,CAACC,WAAW,OAAO,SAASjC,UAAU8B,OAAOI,OAAOJ;QAC7G;IACF;IACA,OAAO;QAACpB;QAAIC;QAAUC;QAAUE;QAAIE;QAAMC;QAAIE;QAAKE;QAAME;QAASC;QAAQG;QAASE;KAAS;AAC9F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/parsing/header-parsing.ts"],"sourcesContent":["export function extractEmailsFromRecipients(recipients: Array<{ emailAddress?: { address?: string; name?: string } }>, mode: 'email' | 'name' | 'raw' = 'email'): string[] {\n if (!Array.isArray(recipients)) return [];\n return recipients\n .map((r) => {\n const name = r?.emailAddress?.name ?? '';\n const email = r?.emailAddress?.address ?? '';\n return mode === 'email' ? email : mode === 'name' ? name || email : `${name} <${email}>`;\n })\n .filter(Boolean);\n}\n\nexport function formatAddressList(recipients: Array<{ emailAddress?: { address?: string; name?: string } }>, mode: 'email' | 'name' | 'raw' = 'email'): string {\n return extractEmailsFromRecipients(recipients, mode).join(', ');\n}\n\nexport function extractFrom(from: { emailAddress?: { address?: string; name?: string } } | undefined): string | undefined {\n if (!from) return undefined;\n return from.emailAddress?.address || from.emailAddress?.name || undefined;\n}\n"],"names":["extractEmailsFromRecipients","recipients","mode","Array","isArray","map","r","name","emailAddress","email","address","filter","Boolean","formatAddressList","join","extractFrom","from","undefined"],"mappings":"AAAA,OAAO,SAASA,4BAA4BC,UAAyE,EAAEC,OAAiC,OAAO;IAC7J,IAAI,CAACC,MAAMC,OAAO,CAACH,aAAa,OAAO,EAAE;IACzC,OAAOA,WACJI,GAAG,CAAC,CAACC;;YACSA,iBACCA;QADd,MAAMC,eAAOD,cAAAA,yBAAAA,kBAAAA,EAAGE,YAAY,cAAfF,sCAAAA,gBAAiBC,IAAI,uCAAI;QACtC,MAAME,iBAAQH,cAAAA,yBAAAA,mBAAAA,EAAGE,YAAY,cAAfF,uCAAAA,iBAAiBI,OAAO,yCAAI;QAC1C,OAAOR,SAAS,UAAUO,QAAQP,SAAS,SAASK,QAAQE,QAAQ,GAAGF,KAAK,EAAE,EAAEE,MAAM,CAAC,CAAC;IAC1F,GACCE,MAAM,CAACC;AACZ;AAEA,OAAO,SAASC,kBAAkBZ,UAAyE,EAAEC,OAAiC,OAAO;IACnJ,OAAOF,4BAA4BC,YAAYC,MAAMY,IAAI,CAAC;AAC5D;AAEA,OAAO,SAASC,YAAYC,IAAwE;QAE3FA,oBAA8BA;IADrC,IAAI,CAACA,MAAM,OAAOC;IAClB,OAAOD,EAAAA,qBAAAA,KAAKR,YAAY,cAAjBQ,yCAAAA,mBAAmBN,OAAO,OAAIM,sBAAAA,KAAKR,YAAY,cAAjBQ,0CAAAA,oBAAmBT,IAAI,KAAIU;AAClE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/parsing/message-extraction.ts"],"sourcesContent":["import type { Client } from '@microsoft/microsoft-graph-client';\nimport type { OutlookMessage } from '../../lib/outlook/types.ts';\nimport { mapOutlookMessage, type NormalizedMessage } from './message-mapping.ts';\n\n/** Fetch a single Outlook message. Throws on non-OK Graph responses. */\nexport async function fetchOutlookMessage(graph: Client, id: string): Promise<NormalizedMessage> {\n if (!id) throw new Error('fetchOutlookMessage: id required');\n const selectFields = ['id', 'conversationId', 'receivedDateTime', 'subject', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients', 'bodyPreview', 'categories', 'body'];\n try {\n const data: unknown = await graph\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .select(selectFields.join(','))\n .get();\n return mapOutlookMessage(data as OutlookMessage, { preferHtml: true });\n } catch (e: unknown) {\n const status = (e as Record<string, unknown>)?.status || (e as Record<string, unknown>)?.code || 'unknown';\n throw new Error(`outlook.fetchMessage: failed (${status})`);\n }\n}\n"],"names":["mapOutlookMessage","fetchOutlookMessage","graph","id","Error","selectFields","data","api","encodeURIComponent","select","join","get","preferHtml","e","status","code"],"mappings":"AAEA,SAASA,iBAAiB,QAAgC,uBAAuB;AAEjF,sEAAsE,GACtE,OAAO,eAAeC,oBAAoBC,KAAa,EAAEC,EAAU;IACjE,IAAI,CAACA,IAAI,MAAM,IAAIC,MAAM;IACzB,MAAMC,eAAe;QAAC;QAAM;QAAkB;QAAoB;QAAW;QAAQ;QAAgB;QAAgB;QAAiB;QAAe;QAAc;KAAO;IAC1K,IAAI;QACF,MAAMC,OAAgB,MAAMJ,MACzBK,GAAG,CAAC,CAAC,aAAa,EAAEC,mBAAmBL,KAAK,EAC5CM,MAAM,CAACJ,aAAaK,IAAI,CAAC,MACzBC,GAAG;QACN,OAAOX,kBAAkBM,MAAwB;YAAEM,YAAY;QAAK;IACtE,EAAE,OAAOC,GAAY;QACnB,MAAMC,SAAS,CAACD,cAAAA,wBAAD,AAACA,EAA+BC,MAAM,MAAKD,cAAAA,wBAAD,AAACA,EAA+BE,IAAI,KAAI;QACjG,MAAM,IAAIX,MAAM,CAAC,8BAA8B,EAAEU,OAAO,CAAC,CAAC;IAC5D;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/parsing/message-mapping.ts"],"sourcesContent":["import { stripHtml, normalizeDateToISO as toIsoUtc } from '@mcp-z/email';\nimport type { OutlookMessage } from '../../lib/outlook/types.ts';\nimport { extractEmailsFromRecipients } from './header-parsing.ts';\n\nexport interface NormalizedAddress {\n address?: string | undefined;\n name?: string | undefined;\n}\nexport interface NormalizedMessage {\n id: string;\n threadId?: string;\n date?: string;\n subject?: string;\n from?: NormalizedAddress;\n to?: string[];\n cc?: string[];\n bcc?: string[];\n snippet?: string;\n labels?: string[];\n body?: string;\n}\n\nexport function mapOutlookMessage(msg: OutlookMessage, opts: { preferHtml?: boolean } = {}): NormalizedMessage {\n const fromAddr = msg.from?.emailAddress;\n const bodyContent = msg.body?.content ?? '';\n const bodyType = String(msg.body?.contentType ?? '').toLowerCase();\n\n let body: string | undefined;\n if (bodyContent) {\n if (opts.preferHtml && bodyType === 'html') body = stripHtml(bodyContent);\n else body = bodyType === 'html' ? stripHtml(bodyContent) : String(bodyContent);\n }\n\n const out: NormalizedMessage = { id: msg.id ?? '' };\n\n if (msg.conversationId) out.threadId = String(msg.conversationId);\n if (msg.receivedDateTime) out.date = toIsoUtc(msg.receivedDateTime) ?? String(msg.receivedDateTime);\n if (msg.subject) out.subject = String(msg.subject);\n\n const fromObj = fromAddr ? { address: fromAddr.address || undefined, name: fromAddr.name || undefined } : undefined;\n if (fromObj && (fromObj.address || fromObj.name)) out.from = fromObj;\n\n const toList = extractEmailsFromRecipients(msg.toRecipients ?? []);\n if (Array.isArray(toList) && toList.length) out.to = toList;\n\n const ccList = extractEmailsFromRecipients(msg.ccRecipients ?? []);\n if (Array.isArray(ccList) && ccList.length) out.cc = ccList;\n\n const bccList = extractEmailsFromRecipients(msg.bccRecipients ?? []);\n if (Array.isArray(bccList) && bccList.length) out.bcc = bccList;\n\n if (msg.bodyPreview) out.snippet = String(msg.bodyPreview);\n if (Array.isArray(msg.categories) && msg.categories.length) out.labels = msg.categories.map(String);\n if (body) out.body = body;\n\n return out;\n}\n"],"names":["stripHtml","normalizeDateToISO","toIsoUtc","extractEmailsFromRecipients","mapOutlookMessage","msg","opts","fromAddr","from","emailAddress","bodyContent","body","content","bodyType","String","contentType","toLowerCase","preferHtml","out","id","conversationId","threadId","receivedDateTime","date","subject","fromObj","address","undefined","name","toList","toRecipients","Array","isArray","length","to","ccList","ccRecipients","cc","bccList","bccRecipients","bcc","bodyPreview","snippet","categories","labels","map"],"mappings":"AAAA,SAASA,SAAS,EAAEC,sBAAsBC,QAAQ,QAAQ,eAAe;AAEzE,SAASC,2BAA2B,QAAQ,sBAAsB;AAoBlE,OAAO,SAASC,kBAAkBC,GAAmB,EAAEC,OAAiC,CAAC,CAAC;qBAWnDD,SAGAH,WAMMG,mBAGAA,mBAGCA;QAzB3BA,WACGA,WACIA;IAFxB,MAAME,YAAWF,YAAAA,IAAIG,IAAI,cAARH,gCAAAA,UAAUI,YAAY;IACvC,MAAMC,uBAAcL,YAAAA,IAAIM,IAAI,cAARN,gCAAAA,UAAUO,OAAO,uCAAI;IACzC,MAAMC,WAAWC,iBAAOT,aAAAA,IAAIM,IAAI,cAARN,iCAAAA,WAAUU,WAAW,yCAAI,IAAIC,WAAW;IAEhE,IAAIL;IACJ,IAAID,aAAa;QACf,IAAIJ,KAAKW,UAAU,IAAIJ,aAAa,QAAQF,OAAOX,UAAUU;aACxDC,OAAOE,aAAa,SAASb,UAAUU,eAAeI,OAAOJ;IACpE;IAEA,MAAMQ,MAAyB;QAAEC,EAAE,GAAEd,UAAAA,IAAIc,EAAE,cAANd,qBAAAA,UAAU;IAAG;IAElD,IAAIA,IAAIe,cAAc,EAAEF,IAAIG,QAAQ,GAAGP,OAAOT,IAAIe,cAAc;IAChE,IAAIf,IAAIiB,gBAAgB,EAAEJ,IAAIK,IAAI,IAAGrB,YAAAA,SAASG,IAAIiB,gBAAgB,eAA7BpB,uBAAAA,YAAkCY,OAAOT,IAAIiB,gBAAgB;IAClG,IAAIjB,IAAImB,OAAO,EAAEN,IAAIM,OAAO,GAAGV,OAAOT,IAAImB,OAAO;IAEjD,MAAMC,UAAUlB,WAAW;QAAEmB,SAASnB,SAASmB,OAAO,IAAIC;QAAWC,MAAMrB,SAASqB,IAAI,IAAID;IAAU,IAAIA;IAC1G,IAAIF,WAAYA,CAAAA,QAAQC,OAAO,IAAID,QAAQG,IAAI,AAAD,GAAIV,IAAIV,IAAI,GAAGiB;IAE7D,MAAMI,SAAS1B,6BAA4BE,oBAAAA,IAAIyB,YAAY,cAAhBzB,+BAAAA,oBAAoB,EAAE;IACjE,IAAI0B,MAAMC,OAAO,CAACH,WAAWA,OAAOI,MAAM,EAAEf,IAAIgB,EAAE,GAAGL;IAErD,MAAMM,SAAShC,6BAA4BE,oBAAAA,IAAI+B,YAAY,cAAhB/B,+BAAAA,oBAAoB,EAAE;IACjE,IAAI0B,MAAMC,OAAO,CAACG,WAAWA,OAAOF,MAAM,EAAEf,IAAImB,EAAE,GAAGF;IAErD,MAAMG,UAAUnC,6BAA4BE,qBAAAA,IAAIkC,aAAa,cAAjBlC,gCAAAA,qBAAqB,EAAE;IACnE,IAAI0B,MAAMC,OAAO,CAACM,YAAYA,QAAQL,MAAM,EAAEf,IAAIsB,GAAG,GAAGF;IAExD,IAAIjC,IAAIoC,WAAW,EAAEvB,IAAIwB,OAAO,GAAG5B,OAAOT,IAAIoC,WAAW;IACzD,IAAIV,MAAMC,OAAO,CAAC3B,IAAIsC,UAAU,KAAKtC,IAAIsC,UAAU,CAACV,MAAM,EAAEf,IAAI0B,MAAM,GAAGvC,IAAIsC,UAAU,CAACE,GAAG,CAAC/B;IAC5F,IAAIH,MAAMO,IAAIP,IAAI,GAAGA;IAErB,OAAOO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/email/querying/client-filter.ts"],"sourcesContent":["import type { FieldOperator } from '@mcp-z/email';\nimport type { Message, Recipient } from '@microsoft/microsoft-graph-types';\nimport type { OutlookQuery } from '../../schemas/outlook-query-schema.ts';\nimport { mapOutlookCategory } from './query-builder.ts';\n\ntype Predicate = (message: Message) => boolean;\n\nexport function buildClientPredicate(query: OutlookQuery): Predicate {\n const nodePredicate = buildNodePredicate(query);\n return (message) => nodePredicate(message);\n}\n\nexport function needsBody(query: OutlookQuery | undefined | null): boolean {\n return hasBodyTextOrExact(query);\n}\n\nfunction buildNodePredicate(node: OutlookQuery | undefined | null): Predicate {\n if (!node || typeof node !== 'object') return () => true;\n\n if (node.$and) {\n const children = node.$and.map(buildNodePredicate);\n return (message) => children.every((child) => child(message));\n }\n if (node.$or) {\n const children = node.$or.map(buildNodePredicate);\n return (message) => children.some((child) => child(message));\n }\n if (node.$not) {\n const child = buildNodePredicate(node.$not);\n return (message) => !child(message);\n }\n\n const predicates: Predicate[] = [];\n\n if ('hasAttachment' in node && typeof node.hasAttachment === 'boolean') {\n predicates.push((message) => message.hasAttachments === node.hasAttachment);\n }\n if ('isRead' in node && typeof node.isRead === 'boolean') {\n predicates.push((message) => message.isRead === node.isRead);\n }\n if ('importance' in node && node.importance) {\n const expected = node.importance.toLowerCase();\n predicates.push((message) => typeof message.importance === 'string' && message.importance.toLowerCase() === expected);\n }\n if ('date' in node && node.date) {\n const { $gte, $lt } = node.date;\n predicates.push((message) => matchesDate(message.receivedDateTime, $gte, $lt));\n }\n\n if ('from' in node && node.from) {\n const from = node.from;\n predicates.push((message) => matchesAddressField(normalizeAddress(message.from), from));\n }\n if ('to' in node && node.to) {\n const to = node.to;\n predicates.push((message) => matchesRecipientField(message.toRecipients, to));\n }\n if ('cc' in node && node.cc) {\n const cc = node.cc;\n predicates.push((message) => matchesRecipientField(message.ccRecipients, cc));\n }\n if ('bcc' in node && node.bcc) {\n const bcc = node.bcc;\n predicates.push((message) => matchesRecipientField(message.bccRecipients, bcc));\n }\n if ('subject' in node && node.subject) {\n const subject = node.subject;\n predicates.push((message) => matchesSubject(message, subject));\n }\n if ('text' in node && node.text) {\n const text = node.text;\n predicates.push((message) => matchesText(message, text));\n }\n if ('body' in node && node.body) {\n const body = node.body;\n predicates.push((message) => matchesBody(message, body));\n }\n if ('exactPhrase' in node && node.exactPhrase) {\n const exactPhrase = node.exactPhrase;\n predicates.push((message) => matchesExactPhrase(message, exactPhrase));\n }\n if ('categories' in node && node.categories) {\n const categories = node.categories;\n predicates.push((message) => matchesCategoryField(message.categories ?? [], categories));\n }\n if ('label' in node && node.label) {\n const label = node.label;\n predicates.push((message) => matchesLabelField(message.categories ?? [], label));\n }\n\n if (predicates.length === 0) return () => true;\n return (message) => predicates.every((predicate) => predicate(message));\n}\n\nfunction hasBodyTextOrExact(node: OutlookQuery | undefined | null): boolean {\n if (!node || typeof node !== 'object') return false;\n if ('body' in node && node.body) return true;\n if ('text' in node && node.text) return true;\n if ('exactPhrase' in node && node.exactPhrase) return true;\n if ('$and' in node && node.$and) {\n return node.$and.some((child) => hasBodyTextOrExact(child));\n }\n if ('$or' in node && node.$or) {\n return node.$or.some((child) => hasBodyTextOrExact(child));\n }\n if ('$not' in node && node.$not) {\n return hasBodyTextOrExact(node.$not);\n }\n return false;\n}\n\nfunction matchesSubject(message: Message, value: string | FieldOperator): boolean {\n const normalizedSubject = normalizeForMatch(message.subject);\n return evaluateOperator(value, (term) => normalizedSubject.includes(term));\n}\n\nfunction matchesText(message: Message, value: string | FieldOperator): boolean {\n const textSources = getTextSources(message);\n return evaluateOperator(value, (term) => textSources.some((source) => source.includes(term)));\n}\n\nfunction matchesBody(message: Message, value: string | FieldOperator): boolean {\n const bodyContent = normalizeForMatch(message.body?.content);\n return evaluateOperator(value, (term) => bodyContent.includes(term));\n}\n\nfunction matchesExactPhrase(message: Message, phrase: string): boolean {\n const normalizedPhrase = normalizeTerm(phrase);\n if (!normalizedPhrase) return false;\n const textSources = getTextSources(message);\n return textSources.some((source) => source.includes(normalizedPhrase));\n}\n\nfunction matchesAddressField(addressData: NormalizedAddress, value: string | FieldOperator): boolean {\n const matchTerm = (term: string) => {\n const addressMatch = addressData.address.includes(term);\n const nameMatch = addressData.name.includes(term);\n if (term.includes('@')) {\n return addressMatch || nameMatch;\n }\n return addressMatch || nameMatch;\n };\n return evaluateOperator(value, matchTerm);\n}\n\ntype NormalizedAddress = { address: string; name: string };\n\nfunction normalizeAddress(recipient: Recipient | null | undefined): NormalizedAddress {\n return {\n address: normalizeForMatch(recipient?.emailAddress?.address),\n name: normalizeForMatch(recipient?.emailAddress?.name),\n };\n}\n\nfunction matchesRecipientField(recipients: Recipient[] | null | undefined, value: string | FieldOperator): boolean {\n const normalizedRecipients = (recipients ?? []).map((recipient) => ({\n address: normalizeForMatch(recipient?.emailAddress?.address),\n name: normalizeForMatch(recipient?.emailAddress?.name),\n }));\n const matchTerm = (term: string) => normalizedRecipients.some((recipient) => recipient.address.includes(term) || recipient.name.includes(term));\n return evaluateOperator(value, matchTerm);\n}\n\nfunction matchesCategoryField(categories: string[], value: string | FieldOperator): boolean {\n const mappedCategories = categories.map((category) => category ?? '');\n const matchTerm = (term: string) => {\n try {\n const mappedTerm = mapOutlookCategory(term);\n return mappedCategories.includes(mappedTerm);\n } catch {\n return false;\n }\n };\n return evaluateOperator(value, matchTerm);\n}\n\nfunction matchesLabelField(categories: string[], value: string | FieldOperator): boolean {\n const normalizeLabelTerm = (input: string): string | null => {\n const trimmed = input.trim();\n return trimmed === '' ? null : trimmed;\n };\n const matchTerm = (term: string) => categories.includes(term);\n return evaluateOperator(value, matchTerm, normalizeLabelTerm);\n}\n\nfunction matchesDate(received: string | null | undefined, gte?: string, lt?: string): boolean {\n if (!received) return false;\n const receivedTs = Date.parse(received);\n if (Number.isNaN(receivedTs)) return false;\n if (gte) {\n const start = Date.parse(`${gte}T00:00:00Z`);\n if (Number.isNaN(start) || receivedTs < start) return false;\n }\n if (lt) {\n const end = Date.parse(`${lt}T00:00:00Z`);\n if (Number.isNaN(end) || receivedTs >= end) return false;\n }\n return true;\n}\n\nfunction evaluateOperator(value: string | FieldOperator, matcher: (normalizedTerm: string) => boolean, normalizeFn: (input: string) => string | null = normalizeTerm): boolean {\n if (typeof value === 'string') {\n const normalized = normalizeFn(value);\n return normalized !== null && matcher(normalized);\n }\n let hasConstraint = false;\n if (Array.isArray(value.$any) && value.$any.length > 0) {\n hasConstraint = true;\n const terms = value.$any.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.length === 0 || !terms.some(matcher)) return false;\n }\n if (Array.isArray(value.$all) && value.$all.length > 0) {\n hasConstraint = true;\n const terms = value.$all.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.length === 0 || !terms.every(matcher)) return false;\n }\n if (Array.isArray(value.$none) && value.$none.length > 0) {\n hasConstraint = true;\n const terms = value.$none.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.some(matcher)) return false;\n }\n return !!hasConstraint;\n}\n\nfunction normalizeTerm(input: string): string | null {\n const collapsed = input.replace(/\\s+/g, ' ').trim().toLowerCase();\n return collapsed === '' ? null : collapsed;\n}\n\nfunction normalizeForMatch(value?: string | null): string {\n return normalizeTerm(value ?? '') ?? '';\n}\n\nfunction getTextSources(message: Message): string[] {\n return [normalizeForMatch(message.subject), normalizeForMatch(message.body?.content), normalizeForMatch(message.bodyPreview)];\n}\n"],"names":["mapOutlookCategory","buildClientPredicate","query","nodePredicate","buildNodePredicate","message","needsBody","hasBodyTextOrExact","node","$and","children","map","every","child","$or","some","$not","predicates","hasAttachment","push","hasAttachments","isRead","importance","expected","toLowerCase","date","$gte","$lt","matchesDate","receivedDateTime","from","matchesAddressField","normalizeAddress","to","matchesRecipientField","toRecipients","cc","ccRecipients","bcc","bccRecipients","subject","matchesSubject","text","matchesText","body","matchesBody","exactPhrase","matchesExactPhrase","categories","matchesCategoryField","label","matchesLabelField","length","predicate","value","normalizedSubject","normalizeForMatch","evaluateOperator","term","includes","textSources","getTextSources","source","bodyContent","content","phrase","normalizedPhrase","normalizeTerm","addressData","matchTerm","addressMatch","address","nameMatch","name","recipient","emailAddress","recipients","normalizedRecipients","mappedCategories","category","mappedTerm","normalizeLabelTerm","input","trimmed","trim","received","gte","lt","receivedTs","Date","parse","Number","isNaN","start","end","matcher","normalizeFn","normalized","hasConstraint","Array","isArray","$any","terms","filter","Boolean","$all","$none","collapsed","replace","bodyPreview"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/querying/client-filter.ts"],"sourcesContent":["import type { FieldOperator } from '@mcp-z/email';\nimport type { Message, Recipient } from '@microsoft/microsoft-graph-types';\nimport type { OutlookQuery } from '../../schemas/outlook-query-schema.ts';\nimport { mapOutlookCategory } from './query-builder.ts';\n\ntype Predicate = (message: Message) => boolean;\n\nexport function buildClientPredicate(query: OutlookQuery): Predicate {\n const nodePredicate = buildNodePredicate(query);\n return (message) => nodePredicate(message);\n}\n\nexport function needsBody(query: OutlookQuery | undefined | null): boolean {\n return hasBodyTextOrExact(query);\n}\n\nfunction buildNodePredicate(node: OutlookQuery | undefined | null): Predicate {\n if (!node || typeof node !== 'object') return () => true;\n\n if (node.$and) {\n const children = node.$and.map(buildNodePredicate);\n return (message) => children.every((child) => child(message));\n }\n if (node.$or) {\n const children = node.$or.map(buildNodePredicate);\n return (message) => children.some((child) => child(message));\n }\n if (node.$not) {\n const child = buildNodePredicate(node.$not);\n return (message) => !child(message);\n }\n\n const predicates: Predicate[] = [];\n\n if ('hasAttachment' in node && typeof node.hasAttachment === 'boolean') {\n predicates.push((message) => message.hasAttachments === node.hasAttachment);\n }\n if ('isRead' in node && typeof node.isRead === 'boolean') {\n predicates.push((message) => message.isRead === node.isRead);\n }\n if ('importance' in node && node.importance) {\n const expected = node.importance.toLowerCase();\n predicates.push((message) => typeof message.importance === 'string' && message.importance.toLowerCase() === expected);\n }\n if ('date' in node && node.date) {\n const { $gte, $lt } = node.date;\n predicates.push((message) => matchesDate(message.receivedDateTime, $gte, $lt));\n }\n\n if ('from' in node && node.from) {\n const from = node.from;\n predicates.push((message) => matchesAddressField(normalizeAddress(message.from), from));\n }\n if ('to' in node && node.to) {\n const to = node.to;\n predicates.push((message) => matchesRecipientField(message.toRecipients, to));\n }\n if ('cc' in node && node.cc) {\n const cc = node.cc;\n predicates.push((message) => matchesRecipientField(message.ccRecipients, cc));\n }\n if ('bcc' in node && node.bcc) {\n const bcc = node.bcc;\n predicates.push((message) => matchesRecipientField(message.bccRecipients, bcc));\n }\n if ('subject' in node && node.subject) {\n const subject = node.subject;\n predicates.push((message) => matchesSubject(message, subject));\n }\n if ('text' in node && node.text) {\n const text = node.text;\n predicates.push((message) => matchesText(message, text));\n }\n if ('body' in node && node.body) {\n const body = node.body;\n predicates.push((message) => matchesBody(message, body));\n }\n if ('exactPhrase' in node && node.exactPhrase) {\n const exactPhrase = node.exactPhrase;\n predicates.push((message) => matchesExactPhrase(message, exactPhrase));\n }\n if ('categories' in node && node.categories) {\n const categories = node.categories;\n predicates.push((message) => matchesCategoryField(message.categories ?? [], categories));\n }\n if ('label' in node && node.label) {\n const label = node.label;\n predicates.push((message) => matchesLabelField(message.categories ?? [], label));\n }\n\n if (predicates.length === 0) return () => true;\n return (message) => predicates.every((predicate) => predicate(message));\n}\n\nfunction hasBodyTextOrExact(node: OutlookQuery | undefined | null): boolean {\n if (!node || typeof node !== 'object') return false;\n if ('body' in node && node.body) return true;\n if ('text' in node && node.text) return true;\n if ('exactPhrase' in node && node.exactPhrase) return true;\n if ('$and' in node && node.$and) {\n return node.$and.some((child) => hasBodyTextOrExact(child));\n }\n if ('$or' in node && node.$or) {\n return node.$or.some((child) => hasBodyTextOrExact(child));\n }\n if ('$not' in node && node.$not) {\n return hasBodyTextOrExact(node.$not);\n }\n return false;\n}\n\nfunction matchesSubject(message: Message, value: string | FieldOperator): boolean {\n const normalizedSubject = normalizeForMatch(message.subject);\n return evaluateOperator(value, (term) => normalizedSubject.includes(term));\n}\n\nfunction matchesText(message: Message, value: string | FieldOperator): boolean {\n const textSources = getTextSources(message);\n return evaluateOperator(value, (term) => textSources.some((source) => source.includes(term)));\n}\n\nfunction matchesBody(message: Message, value: string | FieldOperator): boolean {\n const bodyContent = normalizeForMatch(message.body?.content);\n return evaluateOperator(value, (term) => bodyContent.includes(term));\n}\n\nfunction matchesExactPhrase(message: Message, phrase: string): boolean {\n const normalizedPhrase = normalizeTerm(phrase);\n if (!normalizedPhrase) return false;\n const textSources = getTextSources(message);\n return textSources.some((source) => source.includes(normalizedPhrase));\n}\n\nfunction matchesAddressField(addressData: NormalizedAddress, value: string | FieldOperator): boolean {\n const matchTerm = (term: string) => {\n const addressMatch = addressData.address.includes(term);\n const nameMatch = addressData.name.includes(term);\n if (term.includes('@')) {\n return addressMatch || nameMatch;\n }\n return addressMatch || nameMatch;\n };\n return evaluateOperator(value, matchTerm);\n}\n\ntype NormalizedAddress = { address: string; name: string };\n\nfunction normalizeAddress(recipient: Recipient | null | undefined): NormalizedAddress {\n return {\n address: normalizeForMatch(recipient?.emailAddress?.address),\n name: normalizeForMatch(recipient?.emailAddress?.name),\n };\n}\n\nfunction matchesRecipientField(recipients: Recipient[] | null | undefined, value: string | FieldOperator): boolean {\n const normalizedRecipients = (recipients ?? []).map((recipient) => ({\n address: normalizeForMatch(recipient?.emailAddress?.address),\n name: normalizeForMatch(recipient?.emailAddress?.name),\n }));\n const matchTerm = (term: string) => normalizedRecipients.some((recipient) => recipient.address.includes(term) || recipient.name.includes(term));\n return evaluateOperator(value, matchTerm);\n}\n\nfunction matchesCategoryField(categories: string[], value: string | FieldOperator): boolean {\n const mappedCategories = categories.map((category) => category ?? '');\n const matchTerm = (term: string) => {\n try {\n const mappedTerm = mapOutlookCategory(term);\n return mappedCategories.includes(mappedTerm);\n } catch {\n return false;\n }\n };\n return evaluateOperator(value, matchTerm);\n}\n\nfunction matchesLabelField(categories: string[], value: string | FieldOperator): boolean {\n const normalizeLabelTerm = (input: string): string | null => {\n const trimmed = input.trim();\n return trimmed === '' ? null : trimmed;\n };\n const matchTerm = (term: string) => categories.includes(term);\n return evaluateOperator(value, matchTerm, normalizeLabelTerm);\n}\n\nfunction matchesDate(received: string | null | undefined, gte?: string, lt?: string): boolean {\n if (!received) return false;\n const receivedTs = Date.parse(received);\n if (Number.isNaN(receivedTs)) return false;\n if (gte) {\n const start = Date.parse(`${gte}T00:00:00Z`);\n if (Number.isNaN(start) || receivedTs < start) return false;\n }\n if (lt) {\n const end = Date.parse(`${lt}T00:00:00Z`);\n if (Number.isNaN(end) || receivedTs >= end) return false;\n }\n return true;\n}\n\nfunction evaluateOperator(value: string | FieldOperator, matcher: (normalizedTerm: string) => boolean, normalizeFn: (input: string) => string | null = normalizeTerm): boolean {\n if (typeof value === 'string') {\n const normalized = normalizeFn(value);\n return normalized !== null && matcher(normalized);\n }\n let hasConstraint = false;\n if (Array.isArray(value.$any) && value.$any.length > 0) {\n hasConstraint = true;\n const terms = value.$any.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.length === 0 || !terms.some(matcher)) return false;\n }\n if (Array.isArray(value.$all) && value.$all.length > 0) {\n hasConstraint = true;\n const terms = value.$all.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.length === 0 || !terms.every(matcher)) return false;\n }\n if (Array.isArray(value.$none) && value.$none.length > 0) {\n hasConstraint = true;\n const terms = value.$none.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.some(matcher)) return false;\n }\n return !!hasConstraint;\n}\n\nfunction normalizeTerm(input: string): string | null {\n const collapsed = input.replace(/\\s+/g, ' ').trim().toLowerCase();\n return collapsed === '' ? null : collapsed;\n}\n\nfunction normalizeForMatch(value?: string | null): string {\n return normalizeTerm(value ?? '') ?? '';\n}\n\nfunction getTextSources(message: Message): string[] {\n return [normalizeForMatch(message.subject), normalizeForMatch(message.body?.content), normalizeForMatch(message.bodyPreview)];\n}\n"],"names":["mapOutlookCategory","buildClientPredicate","query","nodePredicate","buildNodePredicate","message","needsBody","hasBodyTextOrExact","node","$and","children","map","every","child","$or","some","$not","predicates","hasAttachment","push","hasAttachments","isRead","importance","expected","toLowerCase","date","$gte","$lt","matchesDate","receivedDateTime","from","matchesAddressField","normalizeAddress","to","matchesRecipientField","toRecipients","cc","ccRecipients","bcc","bccRecipients","subject","matchesSubject","text","matchesText","body","matchesBody","exactPhrase","matchesExactPhrase","categories","matchesCategoryField","label","matchesLabelField","length","predicate","value","normalizedSubject","normalizeForMatch","evaluateOperator","term","includes","textSources","getTextSources","source","bodyContent","content","phrase","normalizedPhrase","normalizeTerm","addressData","matchTerm","addressMatch","address","nameMatch","name","recipient","emailAddress","recipients","normalizedRecipients","mappedCategories","category","mappedTerm","normalizeLabelTerm","input","trimmed","trim","received","gte","lt","receivedTs","Date","parse","Number","isNaN","start","end","matcher","normalizeFn","normalized","hasConstraint","Array","isArray","$any","terms","filter","Boolean","$all","$none","collapsed","replace","bodyPreview"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/querying/execute-query.ts"],"sourcesContent":["import type { ExecutionResult } from '@mcp-z/email';\nimport type { Client } from '@microsoft/microsoft-graph-client';\nimport type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\nimport type { Logger } from '../../types.ts';\nimport { searchMessages } from './search-execution.ts';\n\nexport interface ExecuteQueryOptions {\n readonly logger: Logger;\n readonly limit?: number;\n readonly includeBody?: boolean;\n readonly maxPages?: number | null;\n readonly maxItemsScanned?: number | null;\n readonly pageSize?: number;\n readonly pageToken?: string;\n readonly timezone?: string;\n readonly abortSignal?: AbortSignal;\n}\n\n/**\n * Execute an Outlook query with direct, single-attempt execution.\n * No planning, no fallbacks, no retries.\n * Microsoft Graph errors are returned directly to the caller for actionable feedback.\n */\nexport async function executeQuery<T>(graph: Client, query: QueryNode | undefined, options: ExecuteQueryOptions, transform: (item: unknown) => T): Promise<ExecutionResult<T>> {\n const { logger, limit, includeBody, maxPages, maxItemsScanned, pageSize, pageToken } = options;\n\n // Single execution - direct query to Microsoft Graph API\n logger.info('executeQuery: executing direct Outlook query');\n\n try {\n const result = await searchMessages(graph, {\n ...(query !== undefined && { query }),\n limit: limit ?? 50,\n includeBody: includeBody ?? false,\n maxPages: maxPages ?? null,\n maxItemsScanned: maxItemsScanned ?? null,\n pageSize: pageSize ?? 50,\n pageToken: pageToken ?? undefined,\n logger,\n });\n\n // Transform directly - if Microsoft Graph returns invalid data, fail loud\n const transformedResults = result.messages.map((item, index) => {\n try {\n return transform(item);\n } catch (transformError) {\n logger.error(`Transform function failed for item ${index}`, {\n itemIndex: index,\n error: transformError instanceof Error ? transformError.message : String(transformError),\n });\n throw new Error(`Transform failed at item ${index}: ${transformError}`);\n }\n });\n\n logger.info(`executeQuery: succeeded with ${transformedResults.length} results`);\n\n return {\n success: true,\n items: transformedResults,\n metadata: {\n nextPageToken: result.nextPageToken,\n totalFetched: result.messages.length,\n },\n };\n } catch (error) {\n // Re-throw errors directly - no fallback logic\n logger.error('executeQuery: failed', error as Record<string, unknown>);\n throw error;\n }\n}\n"],"names":["searchMessages","executeQuery","graph","query","options","transform","logger","limit","includeBody","maxPages","maxItemsScanned","pageSize","pageToken","info","result","undefined","transformedResults","messages","map","item","index","transformError","error","itemIndex","Error","message","String","length","success","items","metadata","nextPageToken","totalFetched"],"mappings":"AAIA,SAASA,cAAc,QAAQ,wBAAwB;AAcvD;;;;CAIC,GACD,OAAO,eAAeC,aAAgBC,KAAa,EAAEC,KAA4B,EAAEC,OAA4B,EAAEC,SAA+B;IAC9I,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAEC,WAAW,EAAEC,QAAQ,EAAEC,eAAe,EAAEC,QAAQ,EAAEC,SAAS,EAAE,GAAGR;IAEvF,yDAAyD;IACzDE,OAAOO,IAAI,CAAC;IAEZ,IAAI;QACF,MAAMC,SAAS,MAAMd,eAAeE,OAAO;YACzC,GAAIC,UAAUY,aAAa;gBAAEZ;YAAM,CAAC;YACpCI,KAAK,EAAEA,kBAAAA,mBAAAA,QAAS;YAChBC,WAAW,EAAEA,wBAAAA,yBAAAA,cAAe;YAC5BC,QAAQ,EAAEA,qBAAAA,sBAAAA,WAAY;YACtBC,eAAe,EAAEA,4BAAAA,6BAAAA,kBAAmB;YACpCC,QAAQ,EAAEA,qBAAAA,sBAAAA,WAAY;YACtBC,SAAS,EAAEA,sBAAAA,uBAAAA,YAAaG;YACxBT;QACF;QAEA,0EAA0E;QAC1E,MAAMU,qBAAqBF,OAAOG,QAAQ,CAACC,GAAG,CAAC,CAACC,MAAMC;YACpD,IAAI;gBACF,OAAOf,UAAUc;YACnB,EAAE,OAAOE,gBAAgB;gBACvBf,OAAOgB,KAAK,CAAC,CAAC,mCAAmC,EAAEF,OAAO,EAAE;oBAC1DG,WAAWH;oBACXE,OAAOD,0BAA0BG,QAAQH,eAAeI,OAAO,GAAGC,OAAOL;gBAC3E;gBACA,MAAM,IAAIG,MAAM,CAAC,yBAAyB,EAAEJ,MAAM,EAAE,EAAEC,gBAAgB;YACxE;QACF;QAEAf,OAAOO,IAAI,CAAC,CAAC,6BAA6B,EAAEG,mBAAmBW,MAAM,CAAC,QAAQ,CAAC;QAE/E,OAAO;YACLC,SAAS;YACTC,OAAOb;YACPc,UAAU;gBACRC,eAAejB,OAAOiB,aAAa;gBACnCC,cAAclB,OAAOG,QAAQ,CAACU,MAAM;YACtC;QACF;IACF,EAAE,OAAOL,OAAO;QACd,+CAA+C;QAC/ChB,OAAOgB,KAAK,CAAC,wBAAwBA;QACrC,MAAMA;IACR;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/querying/pagination-token.ts"],"sourcesContent":["const PREFIX = 'v2:';\nexport const FIRST_PAGE_SKIP_TOKEN = '__mcp_outlook_first_page__';\n\ninterface V2Payload {\n v: 2;\n skipToken: string;\n offset: number;\n mode?: string;\n}\n\nexport interface DecodeNextPageTokenResult {\n skipToken?: string;\n offset: number;\n mode?: string;\n legacy: boolean;\n}\n\nexport function encodeNextPageToken(params: { skipToken?: string; offset: number; mode?: string }): string {\n const sanitizedOffset = Math.max(0, Math.trunc(params.offset));\n const payload: V2Payload = {\n v: 2,\n skipToken: params.skipToken ?? FIRST_PAGE_SKIP_TOKEN,\n offset: sanitizedOffset,\n };\n if (typeof params.mode === 'string' && params.mode.length > 0) {\n payload.mode = params.mode;\n }\n const serialized = JSON.stringify(payload);\n return `${PREFIX}${base64UrlEncode(serialized)}`;\n}\n\nexport function decodeNextPageToken(token: string | undefined): DecodeNextPageTokenResult {\n if (!token) {\n return { offset: 0, legacy: true };\n }\n\n if (!token.startsWith(PREFIX)) {\n return { skipToken: token, offset: 0, legacy: true };\n }\n\n const encoded = token.slice(PREFIX.length);\n try {\n const decodedJson = base64UrlDecode(encoded);\n const parsed = JSON.parse(decodedJson) as Record<string, unknown>;\n if (parsed.v !== 2) throw new Error('unsupported token version');\n const skipTokenRaw = parsed.skipToken;\n const offsetRaw = parsed.offset;\n if (typeof skipTokenRaw !== 'string' || skipTokenRaw.trim() === '') throw new Error('missing skipToken');\n if (typeof offsetRaw !== 'number' || !Number.isInteger(offsetRaw) || offsetRaw < 0) throw new Error('invalid offset');\n\n return {\n skipToken: skipTokenRaw === FIRST_PAGE_SKIP_TOKEN ? undefined : skipTokenRaw,\n offset: offsetRaw,\n mode: typeof parsed.mode === 'string' ? parsed.mode : undefined,\n legacy: false,\n };\n } catch {\n return { skipToken: token, offset: 0, legacy: true };\n }\n}\n\nfunction base64UrlEncode(value: string): string {\n return Buffer.from(value, 'utf8').toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nfunction base64UrlDecode(value: string): string {\n const padded = value.replace(/-/g, '+').replace(/_/g, '/');\n const padLength = (4 - (padded.length % 4)) % 4;\n const normalized = padded + '='.repeat(padLength);\n return Buffer.from(normalized, 'base64').toString('utf8');\n}\n"],"names":["PREFIX","FIRST_PAGE_SKIP_TOKEN","encodeNextPageToken","params","sanitizedOffset","Math","max","trunc","offset","payload","v","skipToken","mode","length","serialized","JSON","stringify","base64UrlEncode","decodeNextPageToken","token","legacy","startsWith","encoded","slice","decodedJson","base64UrlDecode","parsed","parse","Error","skipTokenRaw","offsetRaw","trim","Number","isInteger","undefined","value","Buffer","from","toString","replace","padded","padLength","normalized","repeat"],"mappings":"AAAA,MAAMA,SAAS;AACf,OAAO,MAAMC,wBAAwB,6BAA6B;AAgBlE,OAAO,SAASC,oBAAoBC,MAA6D;QAIlFA;IAHb,MAAMC,kBAAkBC,KAAKC,GAAG,CAAC,GAAGD,KAAKE,KAAK,CAACJ,OAAOK,MAAM;IAC5D,MAAMC,UAAqB;QACzBC,GAAG;QACHC,SAAS,GAAER,oBAAAA,OAAOQ,SAAS,cAAhBR,+BAAAA,oBAAoBF;QAC/BO,QAAQJ;IACV;IACA,IAAI,OAAOD,OAAOS,IAAI,KAAK,YAAYT,OAAOS,IAAI,CAACC,MAAM,GAAG,GAAG;QAC7DJ,QAAQG,IAAI,GAAGT,OAAOS,IAAI;IAC5B;IACA,MAAME,aAAaC,KAAKC,SAAS,CAACP;IAClC,OAAO,GAAGT,SAASiB,gBAAgBH,aAAa;AAClD;AAEA,OAAO,SAASI,oBAAoBC,KAAyB;IAC3D,IAAI,CAACA,OAAO;QACV,OAAO;YAAEX,QAAQ;YAAGY,QAAQ;QAAK;IACnC;IAEA,IAAI,CAACD,MAAME,UAAU,CAACrB,SAAS;QAC7B,OAAO;YAAEW,WAAWQ;YAAOX,QAAQ;YAAGY,QAAQ;QAAK;IACrD;IAEA,MAAME,UAAUH,MAAMI,KAAK,CAACvB,OAAOa,MAAM;IACzC,IAAI;QACF,MAAMW,cAAcC,gBAAgBH;QACpC,MAAMI,SAASX,KAAKY,KAAK,CAACH;QAC1B,IAAIE,OAAOhB,CAAC,KAAK,GAAG,MAAM,IAAIkB,MAAM;QACpC,MAAMC,eAAeH,OAAOf,SAAS;QACrC,MAAMmB,YAAYJ,OAAOlB,MAAM;QAC/B,IAAI,OAAOqB,iBAAiB,YAAYA,aAAaE,IAAI,OAAO,IAAI,MAAM,IAAIH,MAAM;QACpF,IAAI,OAAOE,cAAc,YAAY,CAACE,OAAOC,SAAS,CAACH,cAAcA,YAAY,GAAG,MAAM,IAAIF,MAAM;QAEpG,OAAO;YACLjB,WAAWkB,iBAAiB5B,wBAAwBiC,YAAYL;YAChErB,QAAQsB;YACRlB,MAAM,OAAOc,OAAOd,IAAI,KAAK,WAAWc,OAAOd,IAAI,GAAGsB;YACtDd,QAAQ;QACV;IACF,EAAE,OAAM;QACN,OAAO;YAAET,WAAWQ;YAAOX,QAAQ;YAAGY,QAAQ;QAAK;IACrD;AACF;AAEA,SAASH,gBAAgBkB,KAAa;IACpC,OAAOC,OAAOC,IAAI,CAACF,OAAO,QAAQG,QAAQ,CAAC,UAAUC,OAAO,CAAC,OAAO,KAAKA,OAAO,CAAC,OAAO,KAAKA,OAAO,CAAC,OAAO;AAC9G;AAEA,SAASd,gBAAgBU,KAAa;IACpC,MAAMK,SAASL,MAAMI,OAAO,CAAC,MAAM,KAAKA,OAAO,CAAC,MAAM;IACtD,MAAME,YAAY,AAAC,CAAA,IAAKD,OAAO3B,MAAM,GAAG,CAAC,IAAK;IAC9C,MAAM6B,aAAaF,SAAS,IAAIG,MAAM,CAACF;IACvC,OAAOL,OAAOC,IAAI,CAACK,YAAY,UAAUJ,QAAQ,CAAC;AACpD"}
|