@mcp-z/mcp-drive 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +32 -3
  2. package/bin/server.js +1 -1
  3. package/dist/cjs/constants.js.map +1 -1
  4. package/dist/cjs/index.js +13 -13
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/lib/create-store.js.map +1 -1
  7. package/dist/cjs/lib/query-builder.js.map +1 -1
  8. package/dist/cjs/mcp/index.js +6 -6
  9. package/dist/cjs/mcp/index.js.map +1 -1
  10. package/dist/cjs/mcp/prompts/index.js +4 -4
  11. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  12. package/dist/cjs/mcp/prompts/organize-files.js.map +1 -1
  13. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
  14. package/dist/cjs/mcp/resources/file.js.map +1 -1
  15. package/dist/cjs/mcp/resources/index.js +2 -2
  16. package/dist/cjs/mcp/resources/index.js.map +1 -1
  17. package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -1
  18. package/dist/cjs/mcp/tools/file-move.js.map +1 -1
  19. package/dist/cjs/mcp/tools/files-search.js +10 -10
  20. package/dist/cjs/mcp/tools/files-search.js.map +1 -1
  21. package/dist/cjs/mcp/tools/folder-contents.js +7 -7
  22. package/dist/cjs/mcp/tools/folder-contents.js.map +1 -1
  23. package/dist/cjs/mcp/tools/folder-create.js.map +1 -1
  24. package/dist/cjs/mcp/tools/folder-path.js.map +1 -1
  25. package/dist/cjs/mcp/tools/folder-search.js +10 -10
  26. package/dist/cjs/mcp/tools/folder-search.js.map +1 -1
  27. package/dist/cjs/mcp/tools/index.js +14 -14
  28. package/dist/cjs/mcp/tools/index.js.map +1 -1
  29. package/dist/cjs/schemas/drive-query-schema.d.cts +1 -2
  30. package/dist/cjs/schemas/drive-query-schema.d.ts +1 -2
  31. package/dist/cjs/schemas/drive-query-schema.js +12 -7
  32. package/dist/cjs/schemas/drive-query-schema.js.map +1 -1
  33. package/dist/cjs/schemas/drive-validation.js.map +1 -1
  34. package/dist/cjs/schemas/index.js.map +1 -1
  35. package/dist/cjs/setup/config.js +11 -1
  36. package/dist/cjs/setup/config.js.map +1 -1
  37. package/dist/cjs/setup/http.js +6 -2
  38. package/dist/cjs/setup/http.js.map +1 -1
  39. package/dist/cjs/setup/index.d.cts +1 -0
  40. package/dist/cjs/setup/index.d.ts +1 -0
  41. package/dist/cjs/setup/index.js +9 -9
  42. package/dist/cjs/setup/index.js.map +1 -1
  43. package/dist/cjs/setup/oauth-google.d.cts +3 -2
  44. package/dist/cjs/setup/oauth-google.d.ts +3 -2
  45. package/dist/cjs/setup/oauth-google.js +15 -12
  46. package/dist/cjs/setup/oauth-google.js.map +1 -1
  47. package/dist/cjs/setup/runtime.js +9 -9
  48. package/dist/cjs/setup/runtime.js.map +1 -1
  49. package/dist/cjs/setup/stdio.js +2 -2
  50. package/dist/cjs/setup/stdio.js.map +1 -1
  51. package/dist/esm/constants.js.map +1 -1
  52. package/dist/esm/index.js.map +1 -1
  53. package/dist/esm/lib/create-store.js.map +1 -1
  54. package/dist/esm/lib/query-builder.js.map +1 -1
  55. package/dist/esm/mcp/index.js.map +1 -1
  56. package/dist/esm/mcp/prompts/index.js.map +1 -1
  57. package/dist/esm/mcp/prompts/organize-files.js.map +1 -1
  58. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
  59. package/dist/esm/mcp/resources/file.js.map +1 -1
  60. package/dist/esm/mcp/resources/index.js.map +1 -1
  61. package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -1
  62. package/dist/esm/mcp/tools/file-move.js.map +1 -1
  63. package/dist/esm/mcp/tools/files-search.js.map +1 -1
  64. package/dist/esm/mcp/tools/folder-contents.js.map +1 -1
  65. package/dist/esm/mcp/tools/folder-create.js.map +1 -1
  66. package/dist/esm/mcp/tools/folder-path.js.map +1 -1
  67. package/dist/esm/mcp/tools/folder-search.js.map +1 -1
  68. package/dist/esm/mcp/tools/index.js.map +1 -1
  69. package/dist/esm/schemas/drive-query-schema.d.ts +1 -2
  70. package/dist/esm/schemas/drive-query-schema.js +1 -1
  71. package/dist/esm/schemas/drive-query-schema.js.map +1 -1
  72. package/dist/esm/schemas/drive-validation.js.map +1 -1
  73. package/dist/esm/schemas/index.js.map +1 -1
  74. package/dist/esm/setup/config.js +12 -2
  75. package/dist/esm/setup/config.js.map +1 -1
  76. package/dist/esm/setup/http.js +4 -0
  77. package/dist/esm/setup/http.js.map +1 -1
  78. package/dist/esm/setup/index.d.ts +1 -0
  79. package/dist/esm/setup/index.js.map +1 -1
  80. package/dist/esm/setup/oauth-google.d.ts +3 -2
  81. package/dist/esm/setup/oauth-google.js +8 -11
  82. package/dist/esm/setup/oauth-google.js.map +1 -1
  83. package/dist/esm/setup/runtime.js.map +1 -1
  84. package/dist/esm/setup/stdio.js.map +1 -1
  85. package/dist/esm/types.js.map +1 -1
  86. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  import { AccountServer } from '@mcp-z/oauth';
2
- import { createDcrRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';
2
+ import { createDcrRouter, createLoopbackCallbackRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';
3
3
  import { GOOGLE_SCOPE } from '../constants.js';
4
4
  /**
5
5
  * Create Drive OAuth adapters based on transport configuration
@@ -74,6 +74,9 @@ import { GOOGLE_SCOPE } from '../constants.js';
74
74
  const middleware = primary.authMiddleware();
75
75
  // Create auth email provider (stateless)
76
76
  const authAdapter = {
77
+ getAccessToken: ()=>{
78
+ throw new Error('DCR mode does not support getAccessToken - tokens are provided via bearer auth');
79
+ },
77
80
  getUserEmail: ()=>{
78
81
  throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');
79
82
  }
@@ -122,15 +125,7 @@ import { GOOGLE_SCOPE } from '../constants.js';
122
125
  });
123
126
  }
124
127
  // Create auth email provider (used by account management tools)
125
- const authAdapter = {
126
- getUserEmail: (accountId)=>primary.getUserEmail(accountId),
127
- ...'authenticateNewAccount' in primary && primary.authenticateNewAccount ? {
128
- authenticateNewAccount: ()=>{
129
- var _primary_authenticateNewAccount;
130
- return (_primary_authenticateNewAccount = primary.authenticateNewAccount) === null || _primary_authenticateNewAccount === void 0 ? void 0 : _primary_authenticateNewAccount.call(primary);
131
- }
132
- } : {}
133
- };
128
+ const authAdapter = primary;
134
129
  // Select middleware AND account tools based on auth mode
135
130
  let middleware;
136
131
  let accountTools;
@@ -158,11 +153,13 @@ import { GOOGLE_SCOPE } from '../constants.js';
158
153
  service: oauthStaticConfig.service
159
154
  });
160
155
  }
156
+ const loopbackRouter = primary instanceof LoopbackOAuthProvider && oauthStaticConfig.redirectUri ? createLoopbackCallbackRouter(primary) : undefined;
161
157
  return {
162
158
  primary,
163
159
  middleware: middleware,
164
160
  authAdapter,
165
161
  accountTools,
166
- accountPrompts
162
+ accountPrompts,
163
+ loopbackRouter
167
164
  };
168
165
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/setup/oauth-google.ts"],"sourcesContent":["import { AccountServer, type AuthEmailProvider } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport { createDcrRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.js';\n\n/**\n * Drive OAuth runtime dependencies\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<CachedToken>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods\n * Uses structural constraints to avoid contravariance issues with handler types.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n withResourceAuth<T extends { name: string; template?: unknown; config?: unknown; handler: unknown }>(module: T): T;\n withPromptAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n}\n\n/**\n * Result of OAuth adapter creation\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AuthEmailProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router;\n}\n\n/**\n * Create Drive OAuth adapters based on transport configuration\n *\n * Returns primary adapter (loopback or service account), pre-configured middleware,\n * auth email provider, and pre-selected account tools based on auth mode.\n *\n * Primary adapter selection is based on auth mode:\n * - 'loopback-oauth': LoopbackOAuthProvider (interactive OAuth with token storage)\n * - 'service-account': ServiceAccountProvider (JWT-based authentication)\n *\n * @param config - Server configuration (transport + auth settings)\n * @param deps - Runtime dependencies (logger, tokenStore, etc.)\n * @returns OAuth adapters with pre-configured middleware and account tools\n * @throws Error if service account mode but no key file provided\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const resolvedBaseUrl = baseUrl ?? config.baseUrl;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: GOOGLE_SCOPE,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(config.serviceAccountKeyFile && { serviceAccountKeyFile: config.serviceAccountKeyFile }),\n ...(resolvedBaseUrl && { baseUrl: resolvedBaseUrl }),\n };\n\n // Create primary adapter based on auth mode\n let primary: LoopbackOAuthProvider | ServiceAccountProvider | 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 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(' '),\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n },\n });\n\n // DCR uses bearer token authentication with middleware validation\n const middleware = primary.authMiddleware();\n\n // Create auth email provider (stateless)\n const authAdapter: AuthEmailProvider = {\n getUserEmail: () => {\n throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');\n },\n };\n\n // No account management tools for DCR\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n return { primary, middleware: middleware as unknown as AuthMiddleware, authAdapter, accountTools, accountPrompts, dcrRouter };\n }\n\n if (config.auth === 'service-account') {\n // Service account mode - JWT-based authentication\n if (!oauthStaticConfig.serviceAccountKeyFile) {\n throw new Error('Service account key file is required when auth mode is \"service-account\". ' + 'Set GOOGLE_SERVICE_ACCOUNT_KEY_FILE environment variable or use --service-account-key-file flag.');\n }\n\n logger.debug('Creating service account provider', { service: oauthStaticConfig.service });\n primary = new ServiceAccountProvider({\n keyFilePath: oauthStaticConfig.serviceAccountKeyFile,\n scopes: oauthStaticConfig.scope.split(' '),\n logger,\n });\n } else {\n // Loopback mode - interactive OAuth with token storage\n logger.debug('Creating loopback OAuth provider', { service: oauthStaticConfig.service });\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && {\n redirectUri: oauthStaticConfig.redirectUri,\n }),\n });\n }\n\n // Create auth email provider (used by account management tools)\n const authAdapter: AuthEmailProvider = {\n getUserEmail: (accountId) => primary.getUserEmail(accountId),\n ...('authenticateNewAccount' in primary && primary.authenticateNewAccount\n ? {\n authenticateNewAccount: () => primary.authenticateNewAccount?.(),\n }\n : {}),\n };\n\n // Select middleware AND account tools based on auth mode\n let middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']>;\n let accountTools: ToolModule[];\n let accountPrompts: PromptModule[];\n\n if (oauthStaticConfig.auth === 'service-account') {\n // Service account mode - no account management tools needed (single identity)\n middleware = primary.authMiddleware();\n accountTools = [];\n accountPrompts = [];\n logger.debug('Service account mode - no account tools', { service: oauthStaticConfig.service });\n } else {\n // Loopback OAuth - multi-account mode\n middleware = primary.authMiddleware();\n\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n accountTools = result.tools as ToolModule[];\n accountPrompts = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n }\n\n return { primary, middleware: middleware as unknown as AuthMiddleware, authAdapter, accountTools, accountPrompts };\n}\n"],"names":["AccountServer","createDcrRouter","DcrOAuthProvider","LoopbackOAuthProvider","ServiceAccountProvider","GOOGLE_SCOPE","createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","resolvedBaseUrl","oauthStaticConfig","service","name","clientId","clientSecret","scope","auth","headless","redirectUri","transport","type","undefined","serviceAccountKeyFile","primary","debug","Error","verifyEndpoint","dcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","middleware","authMiddleware","authAdapter","getUserEmail","accountTools","accountPrompts","keyFilePath","scopes","accountId","authenticateNewAccount","result","createLoopback","tools","prompts"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/setup/oauth-google.ts"],"sourcesContent":["import { type AccountAuthProvider, AccountServer } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport { createDcrRouter, createLoopbackCallbackRouter, DcrOAuthProvider, LoopbackOAuthProvider, ServiceAccountProvider } from '@mcp-z/oauth-google';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { GOOGLE_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\n/**\n * Drive OAuth runtime dependencies\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<CachedToken>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods\n * Uses structural constraints to avoid contravariance issues with handler types.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n withResourceAuth<T extends { name: string; template?: unknown; config?: unknown; handler: unknown }>(module: T): T;\n withPromptAuth<T extends { name: string; config: unknown; handler: unknown }>(module: T): T;\n}\n\n/**\n * Result of OAuth adapter creation\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | ServiceAccountProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AccountAuthProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router;\n loopbackRouter?: Router;\n}\n\n/**\n * Create Drive OAuth adapters based on transport configuration\n *\n * Returns primary adapter (loopback or service account), pre-configured middleware,\n * auth email provider, and pre-selected account tools based on auth mode.\n *\n * Primary adapter selection is based on auth mode:\n * - 'loopback-oauth': LoopbackOAuthProvider (interactive OAuth with token storage)\n * - 'service-account': ServiceAccountProvider (JWT-based authentication)\n *\n * @param config - Server configuration (transport + auth settings)\n * @param deps - Runtime dependencies (logger, tokenStore, etc.)\n * @returns OAuth adapters with pre-configured middleware and account tools\n * @throws Error if service account mode but no key file provided\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const resolvedBaseUrl = baseUrl ?? config.baseUrl;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: GOOGLE_SCOPE,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(config.serviceAccountKeyFile && { serviceAccountKeyFile: config.serviceAccountKeyFile }),\n ...(resolvedBaseUrl && { baseUrl: resolvedBaseUrl }),\n };\n\n // Create primary adapter based on auth mode\n let primary: LoopbackOAuthProvider | ServiceAccountProvider | 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 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(' '),\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n },\n });\n\n // DCR uses bearer token authentication with middleware validation\n const middleware = primary.authMiddleware();\n\n // Create auth email provider (stateless)\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\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n return { primary, middleware: middleware as unknown as AuthMiddleware, authAdapter, accountTools, accountPrompts, dcrRouter };\n }\n\n if (config.auth === 'service-account') {\n // Service account mode - JWT-based authentication\n if (!oauthStaticConfig.serviceAccountKeyFile) {\n throw new Error('Service account key file is required when auth mode is \"service-account\". ' + 'Set GOOGLE_SERVICE_ACCOUNT_KEY_FILE environment variable or use --service-account-key-file flag.');\n }\n\n logger.debug('Creating service account provider', { service: oauthStaticConfig.service });\n primary = new ServiceAccountProvider({\n keyFilePath: oauthStaticConfig.serviceAccountKeyFile,\n scopes: oauthStaticConfig.scope.split(' '),\n logger,\n });\n } else {\n // Loopback mode - interactive OAuth with token storage\n logger.debug('Creating loopback OAuth provider', { service: oauthStaticConfig.service });\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && {\n redirectUri: oauthStaticConfig.redirectUri,\n }),\n });\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 let middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']>;\n let accountTools: ToolModule[];\n let accountPrompts: PromptModule[];\n\n if (oauthStaticConfig.auth === 'service-account') {\n // Service account mode - no account management tools needed (single identity)\n middleware = primary.authMiddleware();\n accountTools = [];\n accountPrompts = [];\n logger.debug('Service account mode - no account tools', { service: oauthStaticConfig.service });\n } else {\n // Loopback OAuth - multi-account mode\n middleware = primary.authMiddleware();\n\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n accountTools = result.tools as ToolModule[];\n accountPrompts = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n }\n\n const loopbackRouter = primary instanceof LoopbackOAuthProvider && oauthStaticConfig.redirectUri ? createLoopbackCallbackRouter(primary) : undefined;\n\n return { primary, middleware: middleware as unknown as AuthMiddleware, authAdapter, accountTools, accountPrompts, loopbackRouter };\n}\n"],"names":["AccountServer","createDcrRouter","createLoopbackCallbackRouter","DcrOAuthProvider","LoopbackOAuthProvider","ServiceAccountProvider","GOOGLE_SCOPE","createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","resolvedBaseUrl","oauthStaticConfig","service","name","clientId","clientSecret","scope","auth","headless","redirectUri","transport","type","undefined","serviceAccountKeyFile","primary","debug","Error","verifyEndpoint","dcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","middleware","authMiddleware","authAdapter","getAccessToken","getUserEmail","accountTools","accountPrompts","keyFilePath","scopes","result","createLoopback","tools","prompts","loopbackRouter"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/setup/runtime.ts"],"sourcesContent":["import { sanitizeForLoggingFormatter } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport type { Logger, MiddlewareLayer } from '@mcp-z/server';\nimport { createLoggingMiddleware } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport pino from 'pino';\nimport createStore from '../lib/create-store.js';\nimport * as mcp from '../mcp/index.js';\nimport type { CommonRuntime, RuntimeDeps, RuntimeOverrides, ServerConfig } from '../types.js';\nimport { type AuthMiddleware, createOAuthAdapters } from './oauth-google.js';\n\nexport function createLogger(config: ServerConfig): Logger {\n const hasStdio = config.transport.type === 'stdio';\n const logsPath = path.join(config.baseDir, 'logs', `${config.name}.log`);\n if (hasStdio) fs.mkdirSync(path.dirname(logsPath), { recursive: true });\n return pino({ level: config.logLevel ?? 'info', formatters: sanitizeForLoggingFormatter() }, hasStdio ? pino.destination({ dest: logsPath, sync: false }) : pino.destination(1));\n}\n\nexport async function createTokenStore(baseDir: string) {\n const storeUri = process.env.STORE_URI || `file://${path.join(baseDir, 'tokens.json')}`;\n return createStore<CachedToken>(storeUri);\n}\n\nexport async function createDcrStore(baseDir: string, required: boolean) {\n if (!required) return undefined;\n const dcrStoreUri = process.env.DCR_STORE_URI || `file://${path.join(baseDir, 'dcr.json')}`;\n return createStore<unknown>(dcrStoreUri);\n}\n\nexport function createAuthLayer(authMiddleware: AuthMiddleware): 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 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 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)];\n\n return {\n deps,\n middlewareFactories,\n createDomainModules,\n close: async () => {},\n };\n}\n"],"names":["sanitizeForLoggingFormatter","createLoggingMiddleware","fs","path","pino","createStore","mcp","createOAuthAdapters","createLogger","config","hasStdio","transport","type","logsPath","join","baseDir","name","mkdirSync","dirname","recursive","level","logLevel","formatters","destination","dest","sync","createTokenStore","storeUri","process","env","STORE_URI","createDcrStore","required","undefined","dcrStoreUri","DCR_STORE_URI","createAuthLayer","authMiddleware","withTool","withToolAuth","withResource","withResourceAuth","withPrompt","withPromptAuth","createLoggingLayer","logger","logging","withToolLogging","withResourceLogging","withPromptLogging","createDefaultRuntime","overrides","auth","Error","tokenStore","baseUrl","port","dcrStore","oauthAdapters","deps","createDomainModules","tools","Object","values","toolFactories","map","factory","resources","resourceFactories","prompts","promptFactories","middlewareFactories","middleware","close"],"mappings":"AAAA,SAASA,2BAA2B,QAAQ,eAAe;AAG3D,SAASC,uBAAuB,QAAQ,gBAAgB;AACxD,YAAYC,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAC7B,OAAOC,UAAU,OAAO;AACxB,OAAOC,iBAAiB,yBAAyB;AACjD,YAAYC,SAAS,kBAAkB;AAEvC,SAA8BC,mBAAmB,QAAQ,oBAAoB;AAE7E,OAAO,SAASC,aAAaC,MAAoB;QAI1BA;IAHrB,MAAMC,WAAWD,OAAOE,SAAS,CAACC,IAAI,KAAK;IAC3C,MAAMC,WAAWV,KAAKW,IAAI,CAACL,OAAOM,OAAO,EAAE,QAAQ,GAAGN,OAAOO,IAAI,CAAC,IAAI,CAAC;IACvE,IAAIN,UAAUR,GAAGe,SAAS,CAACd,KAAKe,OAAO,CAACL,WAAW;QAAEM,WAAW;IAAK;IACrE,OAAOf,KAAK;QAAEgB,KAAK,GAAEX,mBAAAA,OAAOY,QAAQ,cAAfZ,8BAAAA,mBAAmB;QAAQa,YAAYtB;IAA8B,GAAGU,WAAWN,KAAKmB,WAAW,CAAC;QAAEC,MAAMX;QAAUY,MAAM;IAAM,KAAKrB,KAAKmB,WAAW,CAAC;AAC/K;AAEA,OAAO,eAAeG,iBAAiBX,OAAe;IACpD,MAAMY,WAAWC,QAAQC,GAAG,CAACC,SAAS,IAAI,CAAC,OAAO,EAAE3B,KAAKW,IAAI,CAACC,SAAS,gBAAgB;IACvF,OAAOV,YAAyBsB;AAClC;AAEA,OAAO,eAAeI,eAAehB,OAAe,EAAEiB,QAAiB;IACrE,IAAI,CAACA,UAAU,OAAOC;IACtB,MAAMC,cAAcN,QAAQC,GAAG,CAACM,aAAa,IAAI,CAAC,OAAO,EAAEhC,KAAKW,IAAI,CAACC,SAAS,aAAa;IAC3F,OAAOV,YAAqB6B;AAC9B;AAEA,OAAO,SAASE,gBAAgBC,cAA8B;IAC5D,OAAO;QACLC,UAAUD,eAAeE,YAAY;QACrCC,cAAcH,eAAeI,gBAAgB;QAC7CC,YAAYL,eAAeM,cAAc;IAC3C;AACF;AAEA,OAAO,SAASC,mBAAmBC,MAAc;IAC/C,MAAMC,UAAU7C,wBAAwB;QAAE4C;IAAO;IACjD,OAAO;QACLP,UAAUQ,QAAQC,eAAe;QACjCP,cAAcM,QAAQE,mBAAmB;QACzCN,YAAYI,QAAQG,iBAAiB;IACvC;AACF;AAEA,OAAO,eAAeC,qBAAqBzC,MAAoB,EAAE0C,SAA4B;QAK3E1C;IAJhB,IAAIA,OAAO2C,IAAI,KAAK,SAAS3C,OAAOE,SAAS,CAACC,IAAI,KAAK,QAAQ,MAAM,IAAIyC,MAAM;IAE/E,MAAMR,SAASrC,aAAaC;IAC5B,MAAM6C,aAAa,MAAM5B,iBAAiBjB,OAAOM,OAAO;IACxD,MAAMwC,WAAU9C,kBAAAA,OAAO8C,OAAO,cAAd9C,6BAAAA,kBAAmBA,OAAOE,SAAS,CAACC,IAAI,KAAK,UAAUH,OAAOE,SAAS,CAAC6C,IAAI,GAAG,CAAC,iBAAiB,EAAE/C,OAAOE,SAAS,CAAC6C,IAAI,EAAE,GAAGvB;IAC7I,MAAMwB,WAAW,MAAM1B,eAAetB,OAAOM,OAAO,EAAEN,OAAO2C,IAAI,KAAK;IACtE,MAAMM,gBAAgB,MAAMnD,oBAAoBE,QAAQ;QAAEoC;QAAQS;QAAYG;IAAS,GAAGF;IAC1F,MAAMI,OAAoB;QAAElD;QAAQoC;QAAQS;QAAYI;QAAeH;IAAQ;IAC/E,MAAMK,8BACJT,sBAAAA,gCAAAA,UAAWS,mBAAmB,uCAC7B,IAAO,CAAA;YACNC,OAAOC,OAAOC,MAAM,CAACzD,IAAI0D,aAAa,EAAEC,GAAG,CAAC,CAACC,UAAYA;YACzDC,WAAWL,OAAOC,MAAM,CAACzD,IAAI8D,iBAAiB,EAAEH,GAAG,CAAC,CAACC,UAAYA;YACjEG,SAASP,OAAOC,MAAM,CAACzD,IAAIgE,eAAe,EAAEL,GAAG,CAAC,CAACC,UAAYA;QAC/D,CAAA;IACF,MAAMK,+BAAsBpB,sBAAAA,gCAAAA,UAAWoB,mBAAmB,yCAAI;QAAC,IAAMnC,gBAAgBsB,cAAcc,UAAU;QAAG,IAAM5B,mBAAmBC;KAAQ;IAEjJ,OAAO;QACLc;QACAY;QACAX;QACAa,OAAO,WAAa;IACtB;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/setup/runtime.ts"],"sourcesContent":["import { sanitizeForLoggingFormatter } from '@mcp-z/oauth';\nimport type { CachedToken } from '@mcp-z/oauth-google';\nimport type { Logger, MiddlewareLayer } from '@mcp-z/server';\nimport { createLoggingMiddleware } from '@mcp-z/server';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport pino from 'pino';\nimport createStore from '../lib/create-store.ts';\nimport * as mcp from '../mcp/index.ts';\nimport type { CommonRuntime, RuntimeDeps, RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { type AuthMiddleware, createOAuthAdapters } from './oauth-google.ts';\n\nexport function createLogger(config: ServerConfig): Logger {\n const hasStdio = config.transport.type === 'stdio';\n const logsPath = path.join(config.baseDir, 'logs', `${config.name}.log`);\n if (hasStdio) fs.mkdirSync(path.dirname(logsPath), { recursive: true });\n return pino({ level: config.logLevel ?? 'info', formatters: sanitizeForLoggingFormatter() }, hasStdio ? pino.destination({ dest: logsPath, sync: false }) : pino.destination(1));\n}\n\nexport async function createTokenStore(baseDir: string) {\n const storeUri = process.env.STORE_URI || `file://${path.join(baseDir, 'tokens.json')}`;\n return createStore<CachedToken>(storeUri);\n}\n\nexport async function createDcrStore(baseDir: string, required: boolean) {\n if (!required) return undefined;\n const dcrStoreUri = process.env.DCR_STORE_URI || `file://${path.join(baseDir, 'dcr.json')}`;\n return createStore<unknown>(dcrStoreUri);\n}\n\nexport function createAuthLayer(authMiddleware: AuthMiddleware): 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 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 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)];\n\n return {\n deps,\n middlewareFactories,\n createDomainModules,\n close: async () => {},\n };\n}\n"],"names":["sanitizeForLoggingFormatter","createLoggingMiddleware","fs","path","pino","createStore","mcp","createOAuthAdapters","createLogger","config","hasStdio","transport","type","logsPath","join","baseDir","name","mkdirSync","dirname","recursive","level","logLevel","formatters","destination","dest","sync","createTokenStore","storeUri","process","env","STORE_URI","createDcrStore","required","undefined","dcrStoreUri","DCR_STORE_URI","createAuthLayer","authMiddleware","withTool","withToolAuth","withResource","withResourceAuth","withPrompt","withPromptAuth","createLoggingLayer","logger","logging","withToolLogging","withResourceLogging","withPromptLogging","createDefaultRuntime","overrides","auth","Error","tokenStore","baseUrl","port","dcrStore","oauthAdapters","deps","createDomainModules","tools","Object","values","toolFactories","map","factory","resources","resourceFactories","prompts","promptFactories","middlewareFactories","middleware","close"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/setup/stdio.ts"],"sourcesContent":["import { composeMiddleware, connectStdio, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RuntimeOverrides, ServerConfig } from '../types.js';\nimport { createDefaultRuntime } from './runtime.js';\n\nexport async function createStdioServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, tools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n logger.info(`Starting ${config.name} MCP server (stdio)`);\n const { close } = await connectStdio(mcpServer, { logger });\n logger.info('stdio transport ready');\n\n return {\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["composeMiddleware","connectStdio","registerPrompts","registerResources","registerTools","McpServer","createDefaultRuntime","createStdioServer","config","overrides","runtime","modules","createDomainModules","layers","middlewareFactories","map","factory","deps","composed","logger","tools","oauthAdapters","accountTools","prompts","accountPrompts","mcpServer","name","version","resources","info","close"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,YAAY,EAAEC,eAAe,EAAEC,iBAAiB,EAAEC,aAAa,QAAQ,gBAAgB;AACnH,SAASC,SAAS,QAAQ,0CAA0C;AAEpE,SAASC,oBAAoB,QAAQ,eAAe;AAEpD,OAAO,eAAeC,kBAAkBC,MAAoB,EAAEC,SAA4B;IACxF,MAAMC,UAAU,MAAMJ,qBAAqBE,QAAQC;IACnD,MAAME,UAAUD,QAAQE,mBAAmB;IAC3C,MAAMC,SAASH,QAAQI,mBAAmB,CAACC,GAAG,CAAC,CAACC,UAAYA,QAAQN,QAAQO,IAAI;IAChF,MAAMC,WAAWlB,kBAAkBW,SAASE;IAC5C,MAAMM,SAAST,QAAQO,IAAI,CAACE,MAAM;IAElC,MAAMC,QAAQ;WAAIF,SAASE,KAAK;WAAKV,QAAQO,IAAI,CAACI,aAAa,CAACC,YAAY;KAAC;IAC7E,MAAMC,UAAU;WAAIL,SAASK,OAAO;WAAKb,QAAQO,IAAI,CAACI,aAAa,CAACG,cAAc;KAAC;IAEnF,MAAMC,YAAY,IAAIpB,UAAU;QAAEqB,MAAMlB,OAAOkB,IAAI;QAAEC,SAASnB,OAAOmB,OAAO;IAAC;IAC7EvB,cAAcqB,WAAWL;IACzBjB,kBAAkBsB,WAAWP,SAASU,SAAS;IAC/C1B,gBAAgBuB,WAAWF;IAE3BJ,OAAOU,IAAI,CAAC,CAAC,SAAS,EAAErB,OAAOkB,IAAI,CAAC,mBAAmB,CAAC;IACxD,MAAM,EAAEI,KAAK,EAAE,GAAG,MAAM7B,aAAawB,WAAW;QAAEN;IAAO;IACzDA,OAAOU,IAAI,CAAC;IAEZ,OAAO;QACLJ;QACAN;QACAW,OAAO;YACL,MAAMA;YACN,MAAMpB,QAAQoB,KAAK;QACrB;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/setup/stdio.ts"],"sourcesContent":["import { composeMiddleware, connectStdio, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createStdioServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, tools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n logger.info(`Starting ${config.name} MCP server (stdio)`);\n const { close } = await connectStdio(mcpServer, { logger });\n logger.info('stdio transport ready');\n\n return {\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["composeMiddleware","connectStdio","registerPrompts","registerResources","registerTools","McpServer","createDefaultRuntime","createStdioServer","config","overrides","runtime","modules","createDomainModules","layers","middlewareFactories","map","factory","deps","composed","logger","tools","oauthAdapters","accountTools","prompts","accountPrompts","mcpServer","name","version","resources","info","close"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,YAAY,EAAEC,eAAe,EAAEC,iBAAiB,EAAEC,aAAa,QAAQ,gBAAgB;AACnH,SAASC,SAAS,QAAQ,0CAA0C;AAEpE,SAASC,oBAAoB,QAAQ,eAAe;AAEpD,OAAO,eAAeC,kBAAkBC,MAAoB,EAAEC,SAA4B;IACxF,MAAMC,UAAU,MAAMJ,qBAAqBE,QAAQC;IACnD,MAAME,UAAUD,QAAQE,mBAAmB;IAC3C,MAAMC,SAASH,QAAQI,mBAAmB,CAACC,GAAG,CAAC,CAACC,UAAYA,QAAQN,QAAQO,IAAI;IAChF,MAAMC,WAAWlB,kBAAkBW,SAASE;IAC5C,MAAMM,SAAST,QAAQO,IAAI,CAACE,MAAM;IAElC,MAAMC,QAAQ;WAAIF,SAASE,KAAK;WAAKV,QAAQO,IAAI,CAACI,aAAa,CAACC,YAAY;KAAC;IAC7E,MAAMC,UAAU;WAAIL,SAASK,OAAO;WAAKb,QAAQO,IAAI,CAACI,aAAa,CAACG,cAAc;KAAC;IAEnF,MAAMC,YAAY,IAAIpB,UAAU;QAAEqB,MAAMlB,OAAOkB,IAAI;QAAEC,SAASnB,OAAOmB,OAAO;IAAC;IAC7EvB,cAAcqB,WAAWL;IACzBjB,kBAAkBsB,WAAWP,SAASU,SAAS;IAC/C1B,gBAAgBuB,WAAWF;IAE3BJ,OAAOU,IAAI,CAAC,CAAC,SAAS,EAAErB,OAAOkB,IAAI,CAAC,mBAAmB,CAAC;IACxD,MAAM,EAAEI,KAAK,EAAE,GAAG,MAAM7B,aAAawB,WAAW;QAAEN;IAAO;IACzDA,OAAOU,IAAI,CAAC;IAEZ,OAAO;QACLJ;QACAN;QACAW,OAAO;YACL,MAAMA;YACN,MAAMpB,QAAQoB,KAAK;QACrB;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/types.ts"],"sourcesContent":["import type { CachedToken, DcrConfig, OAuthConfig } from '@mcp-z/oauth-google';\nimport type { BaseServerConfig, MiddlewareLayer, PromptModule, ResourceModule, Logger as ServerLogger, ToolModule } from '@mcp-z/server';\nimport type { Keyv } from 'keyv';\nimport type { OAuthAdapters } from './setup/oauth-google.js';\n\nexport type Logger = Pick<Console, 'info' | 'error' | 'warn' | 'debug'>;\n\n/**\n * Composes transport config, OAuth config, and application-level config\n */\nexport interface ServerConfig extends BaseServerConfig, OAuthConfig {\n logLevel: string;\n baseDir: string;\n name: string;\n version: string;\n repositoryUrl: string;\n baseUrl?: string;\n\n // DCR configuration (when auth === 'dcr')\n dcrConfig?: DcrConfig;\n}\n\n/** Runtime dependencies exposed to middleware/factories. */\nexport interface RuntimeDeps {\n config: ServerConfig;\n logger: ServerLogger;\n tokenStore: Keyv<CachedToken>;\n oauthAdapters: OAuthAdapters;\n baseUrl?: string;\n}\n\n/** Collections of MCP modules produced by domain factories. */\nexport type DomainModules = {\n tools: ToolModule[];\n resources: ResourceModule[];\n prompts: PromptModule[];\n};\n\n/** Factory that produces a middleware layer given runtime dependencies. */\nexport type MiddlewareFactory = (deps: RuntimeDeps) => MiddlewareLayer;\n\n/** Shared runtime configuration returned by `createDefaultRuntime`. */\nexport interface CommonRuntime {\n deps: RuntimeDeps;\n middlewareFactories: MiddlewareFactory[];\n createDomainModules: () => DomainModules;\n close: () => Promise<void>;\n}\n\nexport interface RuntimeOverrides {\n middlewareFactories?: MiddlewareFactory[];\n createDomainModules?: () => DomainModules;\n}\n\nexport type { DriveFile, DriveQuery, DriveQueryObject, FieldOperator } from './schemas/index.js';\n"],"names":[],"mappings":"AAsDA,WAAiG"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/types.ts"],"sourcesContent":["import type { CachedToken, DcrConfig, OAuthConfig } from '@mcp-z/oauth-google';\nimport type { BaseServerConfig, MiddlewareLayer, PromptModule, ResourceModule, Logger as ServerLogger, ToolModule } from '@mcp-z/server';\nimport type { Keyv } from 'keyv';\nimport type { OAuthAdapters } from './setup/oauth-google.ts';\n\nexport type Logger = Pick<Console, 'info' | 'error' | 'warn' | 'debug'>;\n\n/**\n * Composes transport config, OAuth config, and application-level config\n */\nexport interface ServerConfig extends BaseServerConfig, OAuthConfig {\n logLevel: string;\n baseDir: string;\n name: string;\n version: string;\n repositoryUrl: string;\n baseUrl?: string;\n\n // DCR configuration (when auth === 'dcr')\n dcrConfig?: DcrConfig;\n}\n\n/** Runtime dependencies exposed to middleware/factories. */\nexport interface RuntimeDeps {\n config: ServerConfig;\n logger: ServerLogger;\n tokenStore: Keyv<CachedToken>;\n oauthAdapters: OAuthAdapters;\n baseUrl?: string;\n}\n\n/** Collections of MCP modules produced by domain factories. */\nexport type DomainModules = {\n tools: ToolModule[];\n resources: ResourceModule[];\n prompts: PromptModule[];\n};\n\n/** Factory that produces a middleware layer given runtime dependencies. */\nexport type MiddlewareFactory = (deps: RuntimeDeps) => MiddlewareLayer;\n\n/** Shared runtime configuration returned by `createDefaultRuntime`. */\nexport interface CommonRuntime {\n deps: RuntimeDeps;\n middlewareFactories: MiddlewareFactory[];\n createDomainModules: () => DomainModules;\n close: () => Promise<void>;\n}\n\nexport interface RuntimeOverrides {\n middlewareFactories?: MiddlewareFactory[];\n createDomainModules?: () => DomainModules;\n}\n\nexport type { DriveFile, DriveQuery, DriveQueryObject, FieldOperator } from './schemas/index.ts';\n"],"names":[],"mappings":"AAsDA,WAAiG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-z/mcp-drive",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "MCP server for Google Drive integration with file operations, folder navigation, search capabilities, and sharing management",
5
5
  "keywords": [
6
6
  "drive",
@@ -79,7 +79,7 @@
79
79
  "cors": "^2.0.0",
80
80
  "express": "^5.0.0",
81
81
  "googleapis": "^169.0.0",
82
- "keyv-registry": "^0.3.0",
82
+ "keyv-registry": "^0.4.0",
83
83
  "module-root-sync": "^2.0.0",
84
84
  "pino": "^10.0.0",
85
85
  "zod": "^4.0.0"