@mcp-z/mcp-drive 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/cjs/index.js.map +1 -1
  2. package/dist/cjs/lib/google-auth.d.cts +9 -0
  3. package/dist/cjs/lib/google-auth.d.ts +9 -0
  4. package/dist/cjs/lib/google-auth.js +16 -0
  5. package/dist/cjs/lib/google-auth.js.map +1 -0
  6. package/dist/cjs/mcp/prompts/query-syntax.d.cts +2 -3
  7. package/dist/cjs/mcp/prompts/query-syntax.d.ts +2 -3
  8. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
  9. package/dist/cjs/mcp/resources/file.d.cts +2 -9
  10. package/dist/cjs/mcp/resources/file.d.ts +2 -9
  11. package/dist/cjs/mcp/resources/file.js +8 -6
  12. package/dist/cjs/mcp/resources/file.js.map +1 -1
  13. package/dist/cjs/mcp/tools/file-move-to-trash.d.cts +1 -1
  14. package/dist/cjs/mcp/tools/file-move-to-trash.d.ts +1 -1
  15. package/dist/cjs/mcp/tools/file-move-to-trash.js +9 -7
  16. package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -1
  17. package/dist/cjs/mcp/tools/file-move.d.cts +1 -1
  18. package/dist/cjs/mcp/tools/file-move.d.ts +1 -1
  19. package/dist/cjs/mcp/tools/file-move.js +15 -10
  20. package/dist/cjs/mcp/tools/file-move.js.map +1 -1
  21. package/dist/cjs/mcp/tools/file-upload.d.cts +1 -1
  22. package/dist/cjs/mcp/tools/file-upload.d.ts +1 -1
  23. package/dist/cjs/mcp/tools/file-upload.js +9 -7
  24. package/dist/cjs/mcp/tools/file-upload.js.map +1 -1
  25. package/dist/cjs/mcp/tools/files-search.d.cts +1 -1
  26. package/dist/cjs/mcp/tools/files-search.d.ts +1 -1
  27. package/dist/cjs/mcp/tools/files-search.js +14 -8
  28. package/dist/cjs/mcp/tools/files-search.js.map +1 -1
  29. package/dist/cjs/mcp/tools/folder-contents.d.cts +1 -1
  30. package/dist/cjs/mcp/tools/folder-contents.d.ts +1 -1
  31. package/dist/cjs/mcp/tools/folder-contents.js +14 -8
  32. package/dist/cjs/mcp/tools/folder-contents.js.map +1 -1
  33. package/dist/cjs/mcp/tools/folder-create.d.cts +1 -1
  34. package/dist/cjs/mcp/tools/folder-create.d.ts +1 -1
  35. package/dist/cjs/mcp/tools/folder-create.js +11 -8
  36. package/dist/cjs/mcp/tools/folder-create.js.map +1 -1
  37. package/dist/cjs/mcp/tools/folder-path.d.cts +1 -1
  38. package/dist/cjs/mcp/tools/folder-path.d.ts +1 -1
  39. package/dist/cjs/mcp/tools/folder-path.js +9 -7
  40. package/dist/cjs/mcp/tools/folder-path.js.map +1 -1
  41. package/dist/cjs/mcp/tools/folder-search.d.cts +1 -1
  42. package/dist/cjs/mcp/tools/folder-search.d.ts +1 -1
  43. package/dist/cjs/mcp/tools/folder-search.js +18 -10
  44. package/dist/cjs/mcp/tools/folder-search.js.map +1 -1
  45. package/dist/cjs/setup/http.d.cts +0 -2
  46. package/dist/cjs/setup/http.d.ts +0 -2
  47. package/dist/cjs/setup/http.js +18 -11
  48. package/dist/cjs/setup/http.js.map +1 -1
  49. package/dist/cjs/setup/stdio.d.cts +0 -2
  50. package/dist/cjs/setup/stdio.d.ts +0 -2
  51. package/dist/cjs/setup/stdio.js +18 -11
  52. package/dist/cjs/setup/stdio.js.map +1 -1
  53. package/dist/esm/index.js +1 -1
  54. package/dist/esm/index.js.map +1 -1
  55. package/dist/esm/lib/google-auth.d.ts +9 -0
  56. package/dist/esm/lib/google-auth.js +11 -0
  57. package/dist/esm/lib/google-auth.js.map +1 -0
  58. package/dist/esm/mcp/prompts/query-syntax.d.ts +2 -3
  59. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
  60. package/dist/esm/mcp/resources/file.d.ts +2 -9
  61. package/dist/esm/mcp/resources/file.js +7 -5
  62. package/dist/esm/mcp/resources/file.js.map +1 -1
  63. package/dist/esm/mcp/tools/file-move-to-trash.d.ts +1 -1
  64. package/dist/esm/mcp/tools/file-move-to-trash.js +9 -7
  65. package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -1
  66. package/dist/esm/mcp/tools/file-move.d.ts +1 -1
  67. package/dist/esm/mcp/tools/file-move.js +15 -10
  68. package/dist/esm/mcp/tools/file-move.js.map +1 -1
  69. package/dist/esm/mcp/tools/file-upload.d.ts +1 -1
  70. package/dist/esm/mcp/tools/file-upload.js +9 -7
  71. package/dist/esm/mcp/tools/file-upload.js.map +1 -1
  72. package/dist/esm/mcp/tools/files-search.d.ts +1 -1
  73. package/dist/esm/mcp/tools/files-search.js +15 -9
  74. package/dist/esm/mcp/tools/files-search.js.map +1 -1
  75. package/dist/esm/mcp/tools/folder-contents.d.ts +1 -1
  76. package/dist/esm/mcp/tools/folder-contents.js +15 -9
  77. package/dist/esm/mcp/tools/folder-contents.js.map +1 -1
  78. package/dist/esm/mcp/tools/folder-create.d.ts +1 -1
  79. package/dist/esm/mcp/tools/folder-create.js +11 -8
  80. package/dist/esm/mcp/tools/folder-create.js.map +1 -1
  81. package/dist/esm/mcp/tools/folder-path.d.ts +1 -1
  82. package/dist/esm/mcp/tools/folder-path.js +9 -7
  83. package/dist/esm/mcp/tools/folder-path.js.map +1 -1
  84. package/dist/esm/mcp/tools/folder-search.d.ts +1 -1
  85. package/dist/esm/mcp/tools/folder-search.js +19 -11
  86. package/dist/esm/mcp/tools/folder-search.js.map +1 -1
  87. package/dist/esm/setup/http.d.ts +0 -2
  88. package/dist/esm/setup/http.js +18 -11
  89. package/dist/esm/setup/http.js.map +1 -1
  90. package/dist/esm/setup/stdio.d.ts +0 -2
  91. package/dist/esm/setup/stdio.js +18 -11
  92. package/dist/esm/setup/stdio.js.map +1 -1
  93. package/package.json +9 -10
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/mcp/tools/folder-path.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport type { drive_v3 } from 'googleapis';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport type { Logger } from '../../types.ts';\n\nconst inputSchema = z.object({\n folderId: z.string().min(1).describe('Folder ID to get path for (or \"root\")'),\n});\n\n// Success branch schema - uses items: for consistency with standard vocabulary\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n path: z.string().describe('Full path from root (e.g., /Work/Projects/2024)'),\n items: z\n .array(\n z.object({\n id: z.string().describe('Folder ID'),\n name: z.string().describe('Folder name'),\n })\n )\n .describe('Path items from root to target folder'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n title: 'Get Folder Path',\n description: 'Get full path from folder to root. Returns human-readable path and items with IDs.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\n/**\n * Resolves the full path for a folder by walking up the parent chain.\n * Returns both the path string and structured segments with IDs and names.\n */\nasync function resolveFolderPath(drive: drive_v3.Drive, folderId: string, logger: Logger): Promise<{ path: string; segments: Array<{ id: string; name: string }> }> {\n // Handle root specially\n if (folderId === 'root') {\n return {\n path: '/',\n segments: [{ id: 'root', name: 'My Drive' }],\n };\n }\n\n const segments: Array<{ id: string; name: string }> = [];\n let currentId = folderId;\n const visited = new Set<string>();\n\n // Walk up the parent chain\n while (currentId && currentId !== 'root') {\n // Prevent infinite loops\n if (visited.has(currentId)) {\n logger.info('Circular folder reference detected', {\n folderId: currentId,\n });\n break;\n }\n visited.add(currentId);\n\n // Fetch folder metadata\n try {\n const response = await drive.files.get({\n fileId: currentId,\n fields: 'id,name,parents',\n });\n\n const id = response.data.id as string;\n const name = (response.data.name as string) || id;\n const parents = response.data.parents as string[] | undefined;\n\n // Add to segments at beginning (we're walking from child to root)\n segments.unshift({ id, name });\n\n // Move to parent\n currentId = (parents && parents.length > 0 ? parents[0] : '') || '';\n } catch (e) {\n logger.info('Failed to resolve folder path', {\n folderId: currentId,\n error: e,\n });\n break;\n }\n }\n\n // Add root if we reached it\n if (currentId === 'root') {\n segments.unshift({ id: 'root', name: 'My Drive' });\n }\n\n // Build path string\n const pathParts = segments.slice(1).map((seg) => seg.name); // Skip root\n const path = pathParts.length > 0 ? `/${pathParts.join('/')}` : '/';\n\n return { path, segments };\n}\n\nasync function handler({ folderId }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('drive.folder.path called', { folderId });\n\n try {\n const drive = google.drive({ version: 'v3', auth: extra.authContext.auth });\n\n const pathResult = await resolveFolderPath(drive, folderId, logger);\n\n logger.info('drive.folder.path returning', {\n path: pathResult.path,\n segmentCount: pathResult.segments.length,\n });\n\n const result: Output = {\n type: 'success' as const,\n path: pathResult.path,\n items: pathResult.segments,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('drive.folder.path error', { error: message });\n\n // Throw McpError\n throw new McpError(ErrorCode.InternalError, `Error getting folder path: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'folder-path' as const,\n config,\n handler,\n };\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","folderId","string","min","describe","successBranchSchema","type","literal","path","items","array","id","name","outputSchema","discriminatedUnion","config","title","description","result","resolveFolderPath","drive","logger","segments","currentId","visited","response","parents","e","pathParts","Set","has","info","add","files","get","fileId","fields","data","unshift","length","error","slice","map","seg","join","handler","extra","pathResult","message","google","version","auth","authContext","segmentCount","content","text","JSON","stringify","structuredContent","Error","String","McpError","ErrorCode","InternalError","stack","undefined"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/mcp/tools/folder-path.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { drive_v3 } from '@googleapis/drive';\nimport { drive as driveApi } from '@googleapis/drive';\nimport { type CallToolResult, ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { z } from 'zod';\nimport { googleAuth } from '../../lib/google-auth.ts';\nimport type { Logger } from '../../types.ts';\n\nconst inputSchema = z.object({\n folderId: z.string().min(1).describe('Folder ID to get path for (or \"root\")'),\n});\n\n// Success branch schema - uses items: for consistency with standard vocabulary\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n path: z.string().describe('Full path from root (e.g., /Work/Projects/2024)'),\n items: z\n .array(\n z.object({\n id: z.string().describe('Folder ID'),\n name: z.string().describe('Folder name'),\n })\n )\n .describe('Path items from root to target folder'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n title: 'Get Folder Path',\n description: 'Get full path from folder to root. Returns human-readable path and items with IDs.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\n/**\n * Resolves the full path for a folder by walking up the parent chain.\n * Returns both the path string and structured segments with IDs and names.\n */\nasync function resolveFolderPath(drive: drive_v3.Drive, folderId: string, logger: Logger): Promise<{ path: string; segments: Array<{ id: string; name: string }> }> {\n // Handle root specially\n if (folderId === 'root') {\n return {\n path: '/',\n segments: [{ id: 'root', name: 'My Drive' }],\n };\n }\n\n const segments: Array<{ id: string; name: string }> = [];\n let currentId = folderId;\n const visited = new Set<string>();\n\n // Walk up the parent chain\n while (currentId && currentId !== 'root') {\n // Prevent infinite loops\n if (visited.has(currentId)) {\n logger.info('Circular folder reference detected', {\n folderId: currentId,\n });\n break;\n }\n visited.add(currentId);\n\n // Fetch folder metadata\n try {\n const response = await drive.files.get({\n fileId: currentId,\n fields: 'id,name,parents',\n supportsAllDrives: true,\n });\n\n const id = response.data.id as string;\n const name = (response.data.name as string) || id;\n const parents = response.data.parents as string[] | undefined;\n\n // Add to segments at beginning (we're walking from child to root)\n segments.unshift({ id, name });\n\n // Move to parent\n currentId = (parents && parents.length > 0 ? parents[0] : '') || '';\n } catch (e) {\n logger.info('Failed to resolve folder path', {\n folderId: currentId,\n error: e,\n });\n break;\n }\n }\n\n // Add root if we reached it\n if (currentId === 'root') {\n segments.unshift({ id: 'root', name: 'My Drive' });\n }\n\n // Build path string\n const pathParts = segments.slice(1).map((seg) => seg.name); // Skip root\n const path = pathParts.length > 0 ? `/${pathParts.join('/')}` : '/';\n\n return { path, segments };\n}\n\nasync function handler({ folderId }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('drive.folder.path called', { folderId });\n\n try {\n const drive = driveApi({ version: 'v3', auth: googleAuth(extra.authContext.auth) });\n\n const pathResult = await resolveFolderPath(drive, folderId, logger);\n\n logger.info('drive.folder.path returning', {\n path: pathResult.path,\n segmentCount: pathResult.segments.length,\n });\n\n const result: Output = {\n type: 'success' as const,\n path: pathResult.path,\n items: pathResult.segments,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('drive.folder.path error', { error: message });\n\n // Throw ProtocolError\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error getting folder path: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'folder-path' as const,\n config,\n handler,\n };\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","folderId","string","min","describe","successBranchSchema","type","literal","path","items","array","id","name","outputSchema","discriminatedUnion","config","title","description","result","resolveFolderPath","drive","logger","segments","currentId","visited","response","parents","e","pathParts","Set","has","info","add","files","get","fileId","fields","supportsAllDrives","data","unshift","length","error","slice","map","seg","join","handler","extra","pathResult","message","driveApi","version","auth","googleAuth","authContext","segmentCount","content","text","JSON","stringify","structuredContent","Error","String","ProtocolError","ProtocolErrorCode","InternalError","stack","undefined"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
- import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import { type CallToolResult } from '@mcp-z/server';
3
3
  import { z } from 'zod';
4
4
  declare const inputSchema: z.ZodObject<{
5
5
  shape: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -1,5 +1,5 @@
1
1
  import type { EnrichedExtra } from '@mcp-z/oauth-google';
2
- import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import { type CallToolResult } from '@mcp-z/server';
3
3
  import { z } from 'zod';
4
4
  declare const inputSchema: z.ZodObject<{
5
5
  shape: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
@@ -9,10 +9,10 @@ Object.defineProperty(exports, "default", {
9
9
  }
10
10
  });
11
11
  var _oauthgoogle = require("@mcp-z/oauth-google");
12
+ var _drive = require("@googleapis/drive");
12
13
  var _server = require("@mcp-z/server");
13
- var _types = require("@modelcontextprotocol/sdk/types.js");
14
- var _googleapis = require("googleapis");
15
14
  var _zod = require("zod");
15
+ var _googleauthts = require("../../lib/google-auth.js");
16
16
  var _querybuilderts = require("../../lib/query-builder.js");
17
17
  var _indexts = require("../../schemas/index.js");
18
18
  function _array_like_to_array(arr, len) {
@@ -329,7 +329,8 @@ var config = {
329
329
  4,
330
330
  drive.files.get({
331
331
  fileId: currentId,
332
- fields: 'parents'
332
+ fields: 'parents',
333
+ supportsAllDrives: true
333
334
  })
334
335
  ];
335
336
  case 3:
@@ -365,7 +366,8 @@ var config = {
365
366
  4,
366
367
  drive.files.get({
367
368
  fileId: currentId,
368
- fields: 'name,parents'
369
+ fields: 'name,parents',
370
+ supportsAllDrives: true
369
371
  })
370
372
  ];
371
373
  case 7:
@@ -434,9 +436,9 @@ function handler(_0, _1) {
434
436
  pageToken: pageToken ? '[provided]' : undefined,
435
437
  fields: fields || 'all'
436
438
  });
437
- drive = _googleapis.google.drive({
439
+ drive = (0, _drive.drive)({
438
440
  version: 'v3',
439
- auth: extra.authContext.auth
441
+ auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
440
442
  });
441
443
  folderMimeType = 'application/vnd.google-apps.folder';
442
444
  if (parsedQuery && 'rawDriveQuery' in parsedQuery && parsedQuery.rawDriveQuery) {
@@ -454,7 +456,12 @@ function handler(_0, _1) {
454
456
  q: qStr,
455
457
  pageSize: validPageSize,
456
458
  fields: 'files(id,name,mimeType,webViewLink,modifiedTime,parents,shared,starred,owners),nextPageToken',
457
- orderBy: 'modifiedTime desc'
459
+ orderBy: 'modifiedTime desc',
460
+ // All three are load-bearing for shared drives: the default `user` corpus omits
461
+ // them, and Drive rejects an `allDrives` corpus unless both flags are set too.
462
+ corpora: 'allDrives',
463
+ supportsAllDrives: true,
464
+ includeItemsFromAllDrives: true
458
465
  };
459
466
  if (pageToken && pageToken.trim().length > 0) {
460
467
  listOptions.pageToken = pageToken;
@@ -535,7 +542,8 @@ function handler(_0, _1) {
535
542
  4,
536
543
  drive.files.get({
537
544
  fileId: parentId,
538
- fields: 'id,name'
545
+ fields: 'id,name',
546
+ supportsAllDrives: true
539
547
  })
540
548
  ];
541
549
  case 1:
@@ -695,8 +703,8 @@ function handler(_0, _1) {
695
703
  logger.error('drive.folder.search error', {
696
704
  error: message
697
705
  });
698
- // Throw McpError for all errors so callers can see Drive validation details
699
- throw new _types.McpError(_types.ErrorCode.InternalError, "Error searching folders: ".concat(message), {
706
+ // Throw ProtocolError for all errors so callers can see Drive validation details
707
+ throw new _server.ProtocolError(_server.ProtocolErrorCode.InternalError, "Error searching folders: ".concat(message), {
700
708
  stack: _instanceof(error, Error) ? error.stack : undefined
701
709
  });
702
710
  case 7:
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/mcp/tools/folder-search.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { createFieldsSchema, createPaginationSchema, createShapeSchema, filterFields, parseFields, toColumnarFormat } from '@mcp-z/server';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport type { drive_v3 } from 'googleapis';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { toDriveQuery } from '../../lib/query-builder.ts';\nimport { DRIVE_FILE_COMMON_PATTERNS, DRIVE_FILE_FIELD_DESCRIPTIONS, DRIVE_FILE_FIELDS, type DriveFile, DriveFileSchema, DriveQueryParameterSchema, parseDriveQueryParameter } from '../../schemas/index.ts';\nimport type { Logger } from '../../types.ts';\n\nconst inputSchema = z.object({\n query: DriveQueryParameterSchema.optional().describe('Structured Drive query object or JSON string. Use rawDriveQuery for raw Drive syntax.'),\n fields: createFieldsSchema({\n availableFields: [...DRIVE_FILE_FIELDS, 'path'] as const,\n fieldDescriptions: {\n ...DRIVE_FILE_FIELD_DESCRIPTIONS,\n path: 'Full folder path like /Work/Projects (requires resolvePaths=true)',\n },\n commonPatterns: DRIVE_FILE_COMMON_PATTERNS,\n resourceName: 'Drive folder',\n }),\n resolvePaths: z.boolean().optional().describe('Resolve full folder paths like /Work/Projects/2024 (requires additional API calls per result)'),\n ...createPaginationSchema({\n defaultPageSize: 50,\n maxPageSize: 1000,\n provider: 'drive',\n }).shape,\n shape: createShapeSchema(),\n});\n\n// Success branch schemas for different shapes\nconst successObjectsBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('objects'),\n items: z.array(DriveFileSchema.extend({ path: z.string().optional().describe('Full folder path (if resolvePaths=true)') })).describe('Matching Drive folders'),\n count: z.number().describe('Number of folders in this page'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\nconst successArraysBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('arrays'),\n columns: z.array(z.string()).describe('Column names in canonical order'),\n rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),\n count: z.number().describe('Number of folders in this page'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\n// Output schema with auth_required support\n// Using z.union instead of discriminatedUnion since we have two success branches with different shapes\nconst outputSchema = z.union([successObjectsBranchSchema, successArraysBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n title: 'Search Folders',\n description: 'Search Google Drive folders with flexible field selection and optional path resolution.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\n// Type for the raw Google Drive API response\ntype DriveFolder = {\n id?: string;\n name?: string;\n mimeType?: string;\n webViewLink?: string;\n modifiedTime?: string;\n parents?: string[];\n shared?: boolean;\n starred?: boolean;\n owners?: Array<{\n displayName?: string;\n emailAddress?: string;\n kind?: string;\n me?: boolean;\n permissionId?: string;\n photoLink?: string;\n }>;\n};\n\ntype DriveFolderResponse = {\n files?: DriveFolder[];\n nextPageToken?: string;\n};\n\n/**\n * Resolves the full path for a folder by walking up the parent chain\n * Caches folder names to reduce redundant API calls\n */\nasync function resolveFolderPath(drive: drive_v3.Drive, folderId: string, folderCache: Map<string, string>, logger: Logger): Promise<string> {\n if (folderId === 'root') return '/';\n\n const pathParts: string[] = [];\n let currentId = folderId;\n const visited = new Set<string>();\n\n while (currentId && currentId !== 'root') {\n // Prevent infinite loops\n if (visited.has(currentId)) {\n logger.info('Circular folder reference detected', {\n folderId: currentId,\n });\n break;\n }\n visited.add(currentId);\n\n // Check cache first\n if (folderCache.has(currentId)) {\n const cachedName = folderCache.get(currentId);\n if (cachedName) {\n pathParts.unshift(cachedName);\n }\n\n // Get parent of cached folder\n try {\n const response = await drive.files.get({\n fileId: currentId,\n fields: 'parents',\n });\n const parents = response.data.parents as string[] | undefined;\n currentId = (parents && parents.length > 0 ? parents[0] : '') || '';\n } catch (_e) {\n logger.info('Failed to get parent for cached folder', {\n folderId: currentId,\n });\n break;\n }\n } else {\n // Fetch folder metadata\n try {\n const response = await drive.files.get({\n fileId: currentId,\n fields: 'name,parents',\n });\n const folderName = response.data.name as string | undefined;\n const parents = response.data.parents as string[] | undefined;\n\n if (folderName) {\n folderCache.set(currentId, folderName);\n pathParts.unshift(folderName);\n }\n\n currentId = (parents && parents.length > 0 ? parents[0] : '') || '';\n } catch (e) {\n logger.info('Failed to resolve folder path', {\n folderId: currentId,\n error: e,\n });\n break;\n }\n }\n }\n\n return `/${pathParts.join('/')}`;\n}\n\nasync function handler({ query, resolvePaths = false, pageSize = 50, pageToken, fields, shape = 'arrays' }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n\n try {\n const parsedQuery = parseDriveQueryParameter(query);\n const requestedFields = parseFields(fields, [...DRIVE_FILE_FIELDS, 'path'] as const);\n\n // Validate and clamp pageSize to Google Drive API limits (1-1000)\n const validPageSize = Math.max(1, Math.min(1000, Math.floor(pageSize || 50)));\n\n logger.info('drive.folder.search called', {\n query: parsedQuery,\n resolvePaths,\n pageSize: validPageSize,\n pageToken: pageToken ? '[provided]' : undefined,\n fields: fields || 'all',\n });\n\n const drive = google.drive({ version: 'v3', auth: extra.authContext.auth });\n\n const folderMimeType = 'application/vnd.google-apps.folder';\n let qStr: string;\n\n if (parsedQuery && 'rawDriveQuery' in parsedQuery && parsedQuery.rawDriveQuery) {\n // Object with rawDriveQuery field - use it directly\n qStr = parsedQuery.rawDriveQuery;\n } else if (parsedQuery) {\n // Structured query object - convert to Drive query string\n const { q } = toDriveQuery(parsedQuery);\n qStr = q || '';\n } else {\n qStr = '';\n }\n\n qStr = qStr ? `(${qStr}) and mimeType='${folderMimeType}'` : `mimeType='${folderMimeType}'`;\n\n const listOptions: {\n q: string;\n pageSize: number;\n fields: string;\n orderBy: string;\n pageToken?: string;\n } = {\n q: qStr,\n pageSize: validPageSize,\n fields: 'files(id,name,mimeType,webViewLink,modifiedTime,parents,shared,starred,owners),nextPageToken',\n orderBy: 'modifiedTime desc',\n };\n if (pageToken && pageToken.trim().length > 0) {\n listOptions.pageToken = pageToken;\n }\n\n const response = await drive.files.list(listOptions);\n\n const res = response.data as DriveFolderResponse;\n const folders = Array.isArray(res?.files) ? res.files : [];\n\n const parentIds = new Set<string>();\n for (const f of folders) {\n if (f?.parents && f.parents.length > 0) {\n for (const parentId of f.parents) {\n if (parentId && parentId !== 'root') {\n parentIds.add(parentId);\n }\n }\n }\n }\n\n const parentNameMap = new Map<string, string>();\n if (parentIds.size > 0) {\n logger.info('Fetching parent names', { count: parentIds.size });\n const parentFetches = Array.from(parentIds).map(async (parentId) => {\n try {\n const parentRes = await drive.files.get({\n fileId: parentId,\n fields: 'id,name',\n });\n const parentName = (parentRes.data.name as string | undefined) || parentId;\n parentNameMap.set(parentId, parentName);\n } catch (e) {\n logger.info('Failed to fetch parent name', { parentId, error: e });\n parentNameMap.set(parentId, parentId); // Fallback to ID\n }\n });\n await Promise.all(parentFetches);\n }\n\n // Cache for folder names to reduce API calls during path resolution\n const folderCache = new Map<string, string>();\n\n const items: (DriveFile & { path?: string })[] = await Promise.all(\n folders.map(async (f: DriveFolder) => {\n const id = f?.id ? String(f.id) : 'unknown';\n const name = f?.name || id;\n const result: DriveFile & { path?: string } = { id, name };\n\n // Only include properties that have actual values\n if (f?.mimeType) result.mimeType = f.mimeType;\n if (f?.webViewLink) result.webViewLink = f.webViewLink;\n if (f?.modifiedTime) result.modifiedTime = f.modifiedTime;\n\n // Build parent objects with names\n if (f?.parents && f.parents.length > 0) {\n result.parents = f.parents.map((parentId) => {\n if (parentId === 'root') {\n return { id: 'root', name: 'My Drive' };\n }\n const parentName = parentNameMap.get(parentId) || parentId;\n return { id: parentId, name: parentName };\n });\n }\n\n if (f?.shared !== undefined) result.shared = f.shared;\n if (f?.starred !== undefined) result.starred = f.starred;\n\n if (f?.owners && f.owners.length > 0) {\n result.owners = f.owners.map((o) => {\n const owner: NonNullable<DriveFile['owners']>[number] = {};\n if (o?.displayName) owner.displayName = o.displayName;\n if (o?.emailAddress) owner.emailAddress = o.emailAddress;\n if (o?.kind) owner.kind = o.kind;\n if (o?.me !== undefined) owner.me = o.me;\n if (o?.permissionId) owner.permissionId = o.permissionId;\n if (o?.photoLink) owner.photoLink = o.photoLink;\n return owner;\n });\n }\n\n // Resolve path if requested\n if (resolvePaths && id !== 'unknown') {\n result.path = await resolveFolderPath(drive, id, folderCache, logger);\n }\n\n return result;\n })\n );\n\n const filteredItems = items.map((item) => filterFields(item, requestedFields));\n\n logger.info('drive.folder.search returning', {\n query: parsedQuery,\n pageSize,\n resultCount: filteredItems.length,\n resolvePaths,\n fields: fields || 'all',\n });\n\n const nextPageToken = res.nextPageToken && res.nextPageToken.trim().length > 0 ? res.nextPageToken : undefined;\n\n // Build result based on shape\n const result: Output =\n shape === 'arrays'\n ? {\n type: 'success' as const,\n shape: 'arrays' as const,\n ...toColumnarFormat(filteredItems, requestedFields, [...DRIVE_FILE_FIELDS, 'path'] as const),\n count: filteredItems.length,\n ...(nextPageToken && { nextPageToken }),\n }\n : {\n type: 'success' as const,\n shape: 'objects' as const,\n items: filteredItems,\n count: filteredItems.length,\n ...(nextPageToken && { nextPageToken }),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('drive.folder.search error', { error: message });\n\n // Throw McpError for all errors so callers can see Drive validation details\n throw new McpError(ErrorCode.InternalError, `Error searching folders: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'folder-search' as const,\n config,\n handler,\n };\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","query","DriveQueryParameterSchema","optional","describe","fields","createFieldsSchema","availableFields","DRIVE_FILE_FIELDS","fieldDescriptions","DRIVE_FILE_FIELD_DESCRIPTIONS","path","commonPatterns","DRIVE_FILE_COMMON_PATTERNS","resourceName","resolvePaths","boolean","createPaginationSchema","defaultPageSize","maxPageSize","provider","shape","createShapeSchema","successObjectsBranchSchema","type","literal","items","array","DriveFileSchema","extend","string","count","number","nextPageToken","successArraysBranchSchema","columns","rows","unknown","outputSchema","union","config","title","description","result","resolveFolderPath","drive","folderId","folderCache","logger","pathParts","currentId","visited","cachedName","response","parents","_e","folderName","e","Set","has","info","add","get","unshift","files","fileId","data","length","name","set","error","join","handler","extra","pageSize","pageToken","parsedQuery","requestedFields","validPageSize","folderMimeType","qStr","q","listOptions","res","folders","parentIds","f","parentId","parentNameMap","parentFetches","filteredItems","message","parseDriveQueryParameter","parseFields","Math","max","min","floor","undefined","google","version","auth","authContext","rawDriveQuery","toDriveQuery","orderBy","trim","list","Array","isArray","Map","size","from","map","parentRes","parentName","Promise","all","id","String","mimeType","webViewLink","modifiedTime","shared","starred","owners","o","owner","displayName","emailAddress","kind","me","permissionId","photoLink","item","filterFields","resultCount","toColumnarFormat","content","text","JSON","stringify","structuredContent","Error","McpError","ErrorCode","InternalError","stack"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/mcp/tools/folder-search.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { drive_v3 } from '@googleapis/drive';\nimport { drive as driveApi } from '@googleapis/drive';\nimport { type CallToolResult, createFieldsSchema, createPaginationSchema, createShapeSchema, filterFields, ProtocolError, ProtocolErrorCode, parseFields, toColumnarFormat } from '@mcp-z/server';\nimport { z } from 'zod';\nimport { googleAuth } from '../../lib/google-auth.ts';\nimport { toDriveQuery } from '../../lib/query-builder.ts';\nimport { DRIVE_FILE_COMMON_PATTERNS, DRIVE_FILE_FIELD_DESCRIPTIONS, DRIVE_FILE_FIELDS, type DriveFile, DriveFileSchema, DriveQueryParameterSchema, parseDriveQueryParameter } from '../../schemas/index.ts';\nimport type { Logger } from '../../types.ts';\n\nconst inputSchema = z.object({\n query: DriveQueryParameterSchema.optional().describe('Structured Drive query object or JSON string. Use rawDriveQuery for raw Drive syntax.'),\n fields: createFieldsSchema({\n availableFields: [...DRIVE_FILE_FIELDS, 'path'] as const,\n fieldDescriptions: {\n ...DRIVE_FILE_FIELD_DESCRIPTIONS,\n path: 'Full folder path like /Work/Projects (requires resolvePaths=true)',\n },\n commonPatterns: DRIVE_FILE_COMMON_PATTERNS,\n resourceName: 'Drive folder',\n }),\n resolvePaths: z.boolean().optional().describe('Resolve full folder paths like /Work/Projects/2024 (requires additional API calls per result)'),\n ...createPaginationSchema({\n defaultPageSize: 50,\n maxPageSize: 1000,\n provider: 'drive',\n }).shape,\n shape: createShapeSchema(),\n});\n\n// Success branch schemas for different shapes\nconst successObjectsBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('objects'),\n items: z.array(DriveFileSchema.extend({ path: z.string().optional().describe('Full folder path (if resolvePaths=true)') })).describe('Matching Drive folders'),\n count: z.number().describe('Number of folders in this page'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\nconst successArraysBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('arrays'),\n columns: z.array(z.string()).describe('Column names in canonical order'),\n rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),\n count: z.number().describe('Number of folders in this page'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\n// Output schema with auth_required support\n// Using z.union instead of discriminatedUnion since we have two success branches with different shapes\nconst outputSchema = z.union([successObjectsBranchSchema, successArraysBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n title: 'Search Folders',\n description: 'Search Google Drive folders with flexible field selection and optional path resolution.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\n// Type for the raw Google Drive API response\ntype DriveFolder = {\n id?: string;\n name?: string;\n mimeType?: string;\n webViewLink?: string;\n modifiedTime?: string;\n parents?: string[];\n shared?: boolean;\n starred?: boolean;\n owners?: Array<{\n displayName?: string;\n emailAddress?: string;\n kind?: string;\n me?: boolean;\n permissionId?: string;\n photoLink?: string;\n }>;\n};\n\ntype DriveFolderResponse = {\n files?: DriveFolder[];\n nextPageToken?: string;\n};\n\n/**\n * Resolves the full path for a folder by walking up the parent chain\n * Caches folder names to reduce redundant API calls\n */\nasync function resolveFolderPath(drive: drive_v3.Drive, folderId: string, folderCache: Map<string, string>, logger: Logger): Promise<string> {\n if (folderId === 'root') return '/';\n\n const pathParts: string[] = [];\n let currentId = folderId;\n const visited = new Set<string>();\n\n while (currentId && currentId !== 'root') {\n // Prevent infinite loops\n if (visited.has(currentId)) {\n logger.info('Circular folder reference detected', {\n folderId: currentId,\n });\n break;\n }\n visited.add(currentId);\n\n // Check cache first\n if (folderCache.has(currentId)) {\n const cachedName = folderCache.get(currentId);\n if (cachedName) {\n pathParts.unshift(cachedName);\n }\n\n // Get parent of cached folder\n try {\n const response = await drive.files.get({\n fileId: currentId,\n fields: 'parents',\n supportsAllDrives: true,\n });\n const parents = response.data.parents as string[] | undefined;\n currentId = (parents && parents.length > 0 ? parents[0] : '') || '';\n } catch (_e) {\n logger.info('Failed to get parent for cached folder', {\n folderId: currentId,\n });\n break;\n }\n } else {\n // Fetch folder metadata\n try {\n const response = await drive.files.get({\n fileId: currentId,\n fields: 'name,parents',\n supportsAllDrives: true,\n });\n const folderName = response.data.name as string | undefined;\n const parents = response.data.parents as string[] | undefined;\n\n if (folderName) {\n folderCache.set(currentId, folderName);\n pathParts.unshift(folderName);\n }\n\n currentId = (parents && parents.length > 0 ? parents[0] : '') || '';\n } catch (e) {\n logger.info('Failed to resolve folder path', {\n folderId: currentId,\n error: e,\n });\n break;\n }\n }\n }\n\n return `/${pathParts.join('/')}`;\n}\n\nasync function handler({ query, resolvePaths = false, pageSize = 50, pageToken, fields, shape = 'arrays' }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n\n try {\n const parsedQuery = parseDriveQueryParameter(query);\n const requestedFields = parseFields(fields, [...DRIVE_FILE_FIELDS, 'path'] as const);\n\n // Validate and clamp pageSize to Google Drive API limits (1-1000)\n const validPageSize = Math.max(1, Math.min(1000, Math.floor(pageSize || 50)));\n\n logger.info('drive.folder.search called', {\n query: parsedQuery,\n resolvePaths,\n pageSize: validPageSize,\n pageToken: pageToken ? '[provided]' : undefined,\n fields: fields || 'all',\n });\n\n const drive = driveApi({ version: 'v3', auth: googleAuth(extra.authContext.auth) });\n\n const folderMimeType = 'application/vnd.google-apps.folder';\n let qStr: string;\n\n if (parsedQuery && 'rawDriveQuery' in parsedQuery && parsedQuery.rawDriveQuery) {\n // Object with rawDriveQuery field - use it directly\n qStr = parsedQuery.rawDriveQuery;\n } else if (parsedQuery) {\n // Structured query object - convert to Drive query string\n const { q } = toDriveQuery(parsedQuery);\n qStr = q || '';\n } else {\n qStr = '';\n }\n\n qStr = qStr ? `(${qStr}) and mimeType='${folderMimeType}'` : `mimeType='${folderMimeType}'`;\n\n const listOptions: {\n q: string;\n pageSize: number;\n fields: string;\n orderBy: string;\n pageToken?: string;\n corpora: string;\n supportsAllDrives: boolean;\n includeItemsFromAllDrives: boolean;\n } = {\n q: qStr,\n pageSize: validPageSize,\n fields: 'files(id,name,mimeType,webViewLink,modifiedTime,parents,shared,starred,owners),nextPageToken',\n orderBy: 'modifiedTime desc',\n // All three are load-bearing for shared drives: the default `user` corpus omits\n // them, and Drive rejects an `allDrives` corpus unless both flags are set too.\n corpora: 'allDrives',\n supportsAllDrives: true,\n includeItemsFromAllDrives: true,\n };\n if (pageToken && pageToken.trim().length > 0) {\n listOptions.pageToken = pageToken;\n }\n\n const response = await drive.files.list(listOptions);\n\n const res = response.data as DriveFolderResponse;\n const folders = Array.isArray(res?.files) ? res.files : [];\n\n const parentIds = new Set<string>();\n for (const f of folders) {\n if (f?.parents && f.parents.length > 0) {\n for (const parentId of f.parents) {\n if (parentId && parentId !== 'root') {\n parentIds.add(parentId);\n }\n }\n }\n }\n\n const parentNameMap = new Map<string, string>();\n if (parentIds.size > 0) {\n logger.info('Fetching parent names', { count: parentIds.size });\n const parentFetches = Array.from(parentIds).map(async (parentId) => {\n try {\n const parentRes = await drive.files.get({\n fileId: parentId,\n fields: 'id,name',\n supportsAllDrives: true,\n });\n const parentName = (parentRes.data.name as string | undefined) || parentId;\n parentNameMap.set(parentId, parentName);\n } catch (e) {\n logger.info('Failed to fetch parent name', { parentId, error: e });\n parentNameMap.set(parentId, parentId); // Fallback to ID\n }\n });\n await Promise.all(parentFetches);\n }\n\n // Cache for folder names to reduce API calls during path resolution\n const folderCache = new Map<string, string>();\n\n const items: (DriveFile & { path?: string })[] = await Promise.all(\n folders.map(async (f: DriveFolder) => {\n const id = f?.id ? String(f.id) : 'unknown';\n const name = f?.name || id;\n const result: DriveFile & { path?: string } = { id, name };\n\n // Only include properties that have actual values\n if (f?.mimeType) result.mimeType = f.mimeType;\n if (f?.webViewLink) result.webViewLink = f.webViewLink;\n if (f?.modifiedTime) result.modifiedTime = f.modifiedTime;\n\n // Build parent objects with names\n if (f?.parents && f.parents.length > 0) {\n result.parents = f.parents.map((parentId) => {\n if (parentId === 'root') {\n return { id: 'root', name: 'My Drive' };\n }\n const parentName = parentNameMap.get(parentId) || parentId;\n return { id: parentId, name: parentName };\n });\n }\n\n if (f?.shared !== undefined) result.shared = f.shared;\n if (f?.starred !== undefined) result.starred = f.starred;\n\n if (f?.owners && f.owners.length > 0) {\n result.owners = f.owners.map((o) => {\n const owner: NonNullable<DriveFile['owners']>[number] = {};\n if (o?.displayName) owner.displayName = o.displayName;\n if (o?.emailAddress) owner.emailAddress = o.emailAddress;\n if (o?.kind) owner.kind = o.kind;\n if (o?.me !== undefined) owner.me = o.me;\n if (o?.permissionId) owner.permissionId = o.permissionId;\n if (o?.photoLink) owner.photoLink = o.photoLink;\n return owner;\n });\n }\n\n // Resolve path if requested\n if (resolvePaths && id !== 'unknown') {\n result.path = await resolveFolderPath(drive, id, folderCache, logger);\n }\n\n return result;\n })\n );\n\n const filteredItems = items.map((item) => filterFields(item, requestedFields));\n\n logger.info('drive.folder.search returning', {\n query: parsedQuery,\n pageSize,\n resultCount: filteredItems.length,\n resolvePaths,\n fields: fields || 'all',\n });\n\n const nextPageToken = res.nextPageToken && res.nextPageToken.trim().length > 0 ? res.nextPageToken : undefined;\n\n // Build result based on shape\n const result: Output =\n shape === 'arrays'\n ? {\n type: 'success' as const,\n shape: 'arrays' as const,\n ...toColumnarFormat(filteredItems, requestedFields, [...DRIVE_FILE_FIELDS, 'path'] as const),\n count: filteredItems.length,\n ...(nextPageToken && { nextPageToken }),\n }\n : {\n type: 'success' as const,\n shape: 'objects' as const,\n items: filteredItems,\n count: filteredItems.length,\n ...(nextPageToken && { nextPageToken }),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('drive.folder.search error', { error: message });\n\n // Throw ProtocolError for all errors so callers can see Drive validation details\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error searching folders: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'folder-search' as const,\n config,\n handler,\n };\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","query","DriveQueryParameterSchema","optional","describe","fields","createFieldsSchema","availableFields","DRIVE_FILE_FIELDS","fieldDescriptions","DRIVE_FILE_FIELD_DESCRIPTIONS","path","commonPatterns","DRIVE_FILE_COMMON_PATTERNS","resourceName","resolvePaths","boolean","createPaginationSchema","defaultPageSize","maxPageSize","provider","shape","createShapeSchema","successObjectsBranchSchema","type","literal","items","array","DriveFileSchema","extend","string","count","number","nextPageToken","successArraysBranchSchema","columns","rows","unknown","outputSchema","union","config","title","description","result","resolveFolderPath","drive","folderId","folderCache","logger","pathParts","currentId","visited","cachedName","response","parents","_e","folderName","e","Set","has","info","add","get","unshift","files","fileId","supportsAllDrives","data","length","name","set","error","join","handler","extra","pageSize","pageToken","parsedQuery","requestedFields","validPageSize","folderMimeType","qStr","q","listOptions","res","folders","parentIds","f","parentId","parentNameMap","parentFetches","filteredItems","message","parseDriveQueryParameter","parseFields","Math","max","min","floor","undefined","driveApi","version","auth","googleAuth","authContext","rawDriveQuery","toDriveQuery","orderBy","corpora","includeItemsFromAllDrives","trim","list","Array","isArray","Map","size","from","map","parentRes","parentName","Promise","all","id","String","mimeType","webViewLink","modifiedTime","shared","starred","owners","o","owner","displayName","emailAddress","kind","me","permissionId","photoLink","item","filterFields","resultCount","toColumnarFormat","content","text","JSON","stringify","structuredContent","Error","ProtocolError","ProtocolErrorCode","InternalError","stack"],"mappings":"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"}
@@ -1,8 +1,6 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
1
  import type { RuntimeOverrides, ServerConfig } from '../types.js';
3
2
  export declare function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides): Promise<{
4
3
  httpServer: import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
5
- mcpServer: McpServer;
6
4
  logger: import("@mcp-z/server").Logger;
7
5
  close: () => Promise<void>;
8
6
  }>;
@@ -1,8 +1,6 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
1
  import type { RuntimeOverrides, ServerConfig } from '../types.js';
3
2
  export declare function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides): Promise<{
4
3
  httpServer: import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
5
- mcpServer: McpServer;
6
4
  logger: import("@mcp-z/server").Logger;
7
5
  close: () => Promise<void>;
8
6
  }>;
@@ -9,7 +9,6 @@ Object.defineProperty(exports, "createHTTPServer", {
9
9
  }
10
10
  });
11
11
  var _server = require("@mcp-z/server");
12
- var _mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
13
12
  var _cors = /*#__PURE__*/ _interop_require_default(require("cors"));
14
13
  var _express = /*#__PURE__*/ _interop_require_default(require("express"));
15
14
  var _runtimets = require("./runtime.js");
@@ -172,7 +171,7 @@ function _unsupported_iterable_to_array(o, minLen) {
172
171
  }
173
172
  function createHTTPServer(config, overrides) {
174
173
  return _async_to_generator(function() {
175
- var runtime, modules, layers, composed, logger, port, tools, prompts, mcpServer, app, publicUrl, _ref, close, httpServer;
174
+ var runtime, modules, layers, composed, logger, port, tools, prompts, buildServer, app, publicUrl, _ref, close, httpServer;
176
175
  return _ts_generator(this, function(_state) {
177
176
  switch(_state.label){
178
177
  case 0:
@@ -192,13 +191,22 @@ function createHTTPServer(config, overrides) {
192
191
  if (!port) throw new Error('Port is required for HTTP transport');
193
192
  tools = _to_consumable_array(composed.tools).concat(_to_consumable_array(runtime.deps.oauthAdapters.accountTools));
194
193
  prompts = _to_consumable_array(composed.prompts).concat(_to_consumable_array(runtime.deps.oauthAdapters.accountPrompts));
195
- mcpServer = new _mcp.McpServer({
196
- name: config.name,
197
- version: config.version
198
- });
199
- (0, _server.registerTools)(mcpServer, tools);
200
- (0, _server.registerResources)(mcpServer, composed.resources);
201
- (0, _server.registerPrompts)(mcpServer, prompts);
194
+ // Built per request (HTTP) and per connection (stdio), not shared. The SDK caches the
195
+ // negotiated protocol revision on the McpServer instance - its own docs say a negotiated
196
+ // session never re-routes a method onto the other era - so one shared instance pins itself
197
+ // to whichever revision reaches it first and answers the other with -32601.
198
+ buildServer = function buildServer() {
199
+ var mcpServer = new _server.McpServer({
200
+ name: config.name,
201
+ version: config.version
202
+ }, {
203
+ cacheHints: _server.defaultCacheHints
204
+ });
205
+ (0, _server.registerTools)(mcpServer, tools);
206
+ (0, _server.registerResources)(mcpServer, composed.resources);
207
+ (0, _server.registerPrompts)(mcpServer, prompts);
208
+ return mcpServer;
209
+ };
202
210
  app = (0, _express.default)();
203
211
  app.use(_express.default.json({
204
212
  limit: '10mb'
@@ -209,7 +217,7 @@ function createHTTPServer(config, overrides) {
209
217
  logger.info("Starting ".concat(config.name, " MCP server (http)"));
210
218
  return [
211
219
  4,
212
- (0, _server.connectHttp)(mcpServer, {
220
+ (0, _server.connectHttp)(buildServer, {
213
221
  logger: logger,
214
222
  app: app,
215
223
  port: port,
@@ -239,7 +247,6 @@ function createHTTPServer(config, overrides) {
239
247
  2,
240
248
  {
241
249
  httpServer: httpServer,
242
- mcpServer: mcpServer,
243
250
  logger: logger,
244
251
  close: function close1() {
245
252
  return _async_to_generator(function() {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, tools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(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(mcpServer, {\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 and the DCR discovery/registration endpoints are\n // meant to be reached from a browser on another origin. Keep cors() for them,\n // 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 (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 mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["createHTTPServer","config","overrides","runtime","modules","layers","composed","logger","port","tools","prompts","mcpServer","app","publicUrl","close","httpServer","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","transport","Error","oauthAdapters","accountTools","accountPrompts","McpServer","name","version","registerTools","registerResources","resources","registerPrompts","express","use","json","limit","baseUrl","URL","undefined","info","connectHttp","allowedOrigins","origin","allowedHosts","host","loopbackRouter","cors","dcrRouter"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, 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 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, tools);\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 and the DCR discovery/registration endpoints are\n // meant to be reached from a browser on another origin. Keep cors() for them,\n // 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 (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","prompts","buildServer","app","publicUrl","close","httpServer","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","transport","Error","oauthAdapters","accountTools","accountPrompts","mcpServer","McpServer","name","version","cacheHints","defaultCacheHints","registerTools","registerResources","resources","registerPrompts","express","use","json","limit","baseUrl","URL","undefined","info","connectHttp","allowedOrigins","origin","allowedHosts","host","loopbackRouter","cors","dcrRouter"],"mappings":"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"}
@@ -1,7 +1,5 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
1
  import type { RuntimeOverrides, ServerConfig } from '../types.js';
3
2
  export declare function createStdioServer(config: ServerConfig, overrides?: RuntimeOverrides): Promise<{
4
- mcpServer: McpServer;
5
3
  logger: import("@mcp-z/server").Logger;
6
4
  close: () => Promise<void>;
7
5
  }>;
@@ -1,7 +1,5 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
1
  import type { RuntimeOverrides, ServerConfig } from '../types.js';
3
2
  export declare function createStdioServer(config: ServerConfig, overrides?: RuntimeOverrides): Promise<{
4
- mcpServer: McpServer;
5
3
  logger: import("@mcp-z/server").Logger;
6
4
  close: () => Promise<void>;
7
5
  }>;
@@ -9,7 +9,6 @@ Object.defineProperty(exports, "createStdioServer", {
9
9
  }
10
10
  });
11
11
  var _server = require("@mcp-z/server");
12
- var _mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
13
12
  var _runtimets = require("./runtime.js");
14
13
  function _array_like_to_array(arr, len) {
15
14
  if (len == null || len > arr.length) len = arr.length;
@@ -165,7 +164,7 @@ function _unsupported_iterable_to_array(o, minLen) {
165
164
  }
166
165
  function createStdioServer(config, overrides) {
167
166
  return _async_to_generator(function() {
168
- var runtime, modules, layers, composed, logger, tools, prompts, mcpServer, close;
167
+ var runtime, modules, layers, composed, logger, tools, prompts, buildServer, close;
169
168
  return _ts_generator(this, function(_state) {
170
169
  switch(_state.label){
171
170
  case 0:
@@ -183,17 +182,26 @@ function createStdioServer(config, overrides) {
183
182
  logger = runtime.deps.logger;
184
183
  tools = _to_consumable_array(composed.tools).concat(_to_consumable_array(runtime.deps.oauthAdapters.accountTools));
185
184
  prompts = _to_consumable_array(composed.prompts).concat(_to_consumable_array(runtime.deps.oauthAdapters.accountPrompts));
186
- mcpServer = new _mcp.McpServer({
187
- name: config.name,
188
- version: config.version
189
- });
190
- (0, _server.registerTools)(mcpServer, tools);
191
- (0, _server.registerResources)(mcpServer, composed.resources);
192
- (0, _server.registerPrompts)(mcpServer, prompts);
185
+ // Built per request (HTTP) and per connection (stdio), not shared. The SDK caches the
186
+ // negotiated protocol revision on the McpServer instance - its own docs say a negotiated
187
+ // session never re-routes a method onto the other era - so one shared instance pins itself
188
+ // to whichever revision reaches it first and answers the other with -32601.
189
+ buildServer = function buildServer() {
190
+ var mcpServer = new _server.McpServer({
191
+ name: config.name,
192
+ version: config.version
193
+ }, {
194
+ cacheHints: _server.defaultCacheHints
195
+ });
196
+ (0, _server.registerTools)(mcpServer, tools);
197
+ (0, _server.registerResources)(mcpServer, composed.resources);
198
+ (0, _server.registerPrompts)(mcpServer, prompts);
199
+ return mcpServer;
200
+ };
193
201
  logger.info("Starting ".concat(config.name, " MCP server (stdio)"));
194
202
  return [
195
203
  4,
196
- (0, _server.connectStdio)(mcpServer, {
204
+ (0, _server.connectStdio)(buildServer, {
197
205
  logger: logger
198
206
  })
199
207
  ];
@@ -203,7 +211,6 @@ function createStdioServer(config, overrides) {
203
211
  return [
204
212
  2,
205
213
  {
206
- mcpServer: mcpServer,
207
214
  logger: logger,
208
215
  close: function close1() {
209
216
  return _async_to_generator(function() {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/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":["createStdioServer","config","overrides","runtime","modules","layers","composed","logger","tools","prompts","mcpServer","close","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","oauthAdapters","accountTools","accountPrompts","McpServer","name","version","registerTools","registerResources","resources","registerPrompts","info","connectStdio"],"mappings":";;;;+BAKsBA;;;eAAAA;;;sBAL6E;mBACzE;yBAEW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9B,SAAeA,kBAAkBC,MAAoB,EAAEC,SAA4B;;YAClFC,SACAC,SACAC,QACAC,UACAC,QAEAC,OACAC,SAEAC,WAMEC;;;;oBAfQ;;wBAAMC,IAAAA,+BAAoB,EAACX,QAAQC;;;oBAA7CC,UAAU;oBACVC,UAAUD,QAAQU,mBAAmB;oBACrCR,SAASF,QAAQW,mBAAmB,CAACC,GAAG,CAAC,SAACC;+BAAYA,QAAQb,QAAQc,IAAI;;oBAC1EX,WAAWY,IAAAA,yBAAiB,EAACd,SAASC;oBACtCE,SAASJ,QAAQc,IAAI,CAACV,MAAM;oBAE5BC,QAAQ,AAAC,qBAAGF,SAASE,KAAK,SAAE,qBAAGL,QAAQc,IAAI,CAACE,aAAa,CAACC,YAAY;oBACtEX,UAAU,AAAC,qBAAGH,SAASG,OAAO,SAAE,qBAAGN,QAAQc,IAAI,CAACE,aAAa,CAACE,cAAc;oBAE5EX,YAAY,IAAIY,cAAS,CAAC;wBAAEC,MAAMtB,OAAOsB,IAAI;wBAAEC,SAASvB,OAAOuB,OAAO;oBAAC;oBAC7EC,IAAAA,qBAAa,EAACf,WAAWF;oBACzBkB,IAAAA,yBAAiB,EAAChB,WAAWJ,SAASqB,SAAS;oBAC/CC,IAAAA,uBAAe,EAAClB,WAAWD;oBAE3BF,OAAOsB,IAAI,CAAC,AAAC,YAAuB,OAAZ5B,OAAOsB,IAAI,EAAC;oBAClB;;wBAAMO,IAAAA,oBAAY,EAACpB,WAAW;4BAAEH,QAAAA;wBAAO;;;oBAAjDI,QAAU,cAAVA;oBACRJ,OAAOsB,IAAI,CAAC;oBAEZ;;wBAAO;4BACLnB,WAAAA;4BACAH,QAAAA;4BACAI,OAAO,SAAPA;;;;;gDACE;;oDAAMA;;;gDAAN;gDACA;;oDAAMR,QAAQQ,KAAK;;;gDAAnB;;;;;;gCACF;;wBACF;;;;IACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/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 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, tools);\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","prompts","buildServer","close","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","oauthAdapters","accountTools","accountPrompts","mcpServer","McpServer","name","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,SAMAC,aASEC;;;;oBAtBQ;;wBAAMC,IAAAA,+BAAoB,EAACX,QAAQC;;;oBAA7CC,UAAU;oBACVC,UAAUD,QAAQU,mBAAmB;oBACrCR,SAASF,QAAQW,mBAAmB,CAACC,GAAG,CAAC,SAACC;+BAAYA,QAAQb,QAAQc,IAAI;;oBAC1EX,WAAWY,IAAAA,yBAAiB,EAACd,SAASC;oBACtCE,SAASJ,QAAQc,IAAI,CAACV,MAAM;oBAE5BC,QAAQ,AAAC,qBAAGF,SAASE,KAAK,SAAE,qBAAGL,QAAQc,IAAI,CAACE,aAAa,CAACC,YAAY;oBACtEX,UAAU,AAAC,qBAAGH,SAASG,OAAO,SAAE,qBAAGN,QAAQc,IAAI,CAACE,aAAa,CAACE,cAAc;oBAElF,sFAAsF;oBACtF,yFAAyF;oBACzF,2FAA2F;oBAC3F,4EAA4E;oBACtEX,cAAc;wBAClB,IAAMY,YAAY,IAAIC,iBAAS,CAAC;4BAAEC,MAAMvB,OAAOuB,IAAI;4BAAEC,SAASxB,OAAOwB,OAAO;wBAAC,GAAG;4BAAEC,YAAYC,yBAAiB;wBAAC;wBAChHC,IAAAA,qBAAa,EAACN,WAAWd;wBACzBqB,IAAAA,yBAAiB,EAACP,WAAWhB,SAASwB,SAAS;wBAC/CC,IAAAA,uBAAe,EAACT,WAAWb;wBAC3B,OAAOa;oBACT;oBAEAf,OAAOyB,IAAI,CAAC,AAAC,YAAuB,OAAZ/B,OAAOuB,IAAI,EAAC;oBAClB;;wBAAMS,IAAAA,oBAAY,EAACvB,aAAa;4BAAEH,QAAAA;wBAAO;;;oBAAnDI,QAAU,cAAVA;oBACRJ,OAAOyB,IAAI,CAAC;oBAEZ;;wBAAO;4BACLzB,QAAAA;4BACAI,OAAO,SAAPA;;;;;gDACE;;oDAAMA;;;gDAAN;gDACA;;oDAAMR,QAAQQ,KAAK;;;gDAAnB;;;;;;gCACF;;wBACF;;;;IACF"}
package/dist/esm/index.js CHANGED
@@ -8,7 +8,7 @@ import * as _setup from './setup/index.js';
8
8
  export { _setup as setup };
9
9
  export * from './types.js';
10
10
  export async function startServer(config) {
11
- // createHTTPServer/createStdioServer pull in @modelcontextprotocol/sdk and every mcp/tools/*.ts
11
+ // createHTTPServer/createStdioServer pull in @mcp-z/server and every mcp/tools/*.ts
12
12
  // (googleapis included); deferred so a --version/--help run never reaches them.
13
13
  const { createHTTPServer } = await import('./setup/http.js');
14
14
  const { createStdioServer } = await import('./setup/stdio.js');
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/index.ts"],"sourcesContent":["import { handleVersionHelp } from './setup/version-help.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n // createHTTPServer/createStdioServer pull in @modelcontextprotocol/sdk and every mcp/tools/*.ts\n // (googleapis included); deferred so a --version/--help run never reaches them.\n const { createHTTPServer } = await import('./setup/http.ts');\n const { createStdioServer } = await import('./setup/stdio.ts');\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags. config.ts's own heavy imports (@mcp-z/oauth-google,\n // @mcp-z/server) are deferred internally, so this static-looking call stays cheap until here.\n const { createConfig } = await import('./setup/config.ts');\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["handleVersionHelp","GOOGLE_SCOPE","mcp","schemas","setup","startServer","config","createHTTPServer","createStdioServer","logger","close","transport","type","process","on","exit","info","Promise","main","versionHelpResult","argv","handled","console","log","output","createConfig","URL","url","pathname"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,0BAA0B;AAG5D,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,sBAAqB,iBAAiB;AAAtC,SAAO,QAAKC,GAAG,GAAuB;AACtC,0BAAyB,qBAAqB;AAA9C,SAAO,YAAKC,OAAO,GAA2B;AAC9C,wBAAuB,mBAAmB;AAA1C,SAAO,UAAKC,KAAK,GAAyB;AAC1C,cAAc,aAAa;AAE3B,OAAO,eAAeC,YAAYC,MAAoB;IACpD,gGAAgG;IAChG,gFAAgF;IAChF,MAAM,EAAEC,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC;IAC1C,MAAM,EAAEC,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC;IAC3C,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGJ,OAAOK,SAAS,CAACC,IAAI,KAAK,UAAU,MAAMJ,kBAAkBF,UAAU,MAAMC,iBAAiBD;IAEvHO,QAAQC,EAAE,CAAC,UAAU;QACnB,MAAMJ;QACNG,QAAQE,IAAI,CAAC;IACf;IAEAN,OAAOO,IAAI,CAAC,CAAC,oBAAoB,EAAEV,OAAOK,SAAS,CAACC,IAAI,CAAC,UAAU,CAAC;IACpE,MAAM,IAAIK,QAAQ,KAAO;AAC3B;AAEA,eAAe,eAAeC;IAC5B,4DAA4D;IAC5D,MAAMC,oBAAoBnB,kBAAkBa,QAAQO,IAAI;IACxD,IAAID,kBAAkBE,OAAO,EAAE;QAC7BC,QAAQC,GAAG,CAACJ,kBAAkBK,MAAM;QACpCX,QAAQE,IAAI,CAAC;IACf;IAEA,kGAAkG;IAClG,8FAA8F;IAC9F,MAAM,EAAEU,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC;IACtC,MAAMnB,SAASmB;IACf,MAAMpB,YAAYC;AACpB;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,YAAYC,GAAG,EAAEC,QAAQ,EAAE;IACzDV;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/index.ts"],"sourcesContent":["import { handleVersionHelp } from './setup/version-help.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n // createHTTPServer/createStdioServer pull in @mcp-z/server and every mcp/tools/*.ts\n // (googleapis included); deferred so a --version/--help run never reaches them.\n const { createHTTPServer } = await import('./setup/http.ts');\n const { createStdioServer } = await import('./setup/stdio.ts');\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags. config.ts's own heavy imports (@mcp-z/oauth-google,\n // @mcp-z/server) are deferred internally, so this static-looking call stays cheap until here.\n const { createConfig } = await import('./setup/config.ts');\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["handleVersionHelp","GOOGLE_SCOPE","mcp","schemas","setup","startServer","config","createHTTPServer","createStdioServer","logger","close","transport","type","process","on","exit","info","Promise","main","versionHelpResult","argv","handled","console","log","output","createConfig","URL","url","pathname"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,0BAA0B;AAG5D,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,sBAAqB,iBAAiB;AAAtC,SAAO,QAAKC,GAAG,GAAuB;AACtC,0BAAyB,qBAAqB;AAA9C,SAAO,YAAKC,OAAO,GAA2B;AAC9C,wBAAuB,mBAAmB;AAA1C,SAAO,UAAKC,KAAK,GAAyB;AAC1C,cAAc,aAAa;AAE3B,OAAO,eAAeC,YAAYC,MAAoB;IACpD,oFAAoF;IACpF,gFAAgF;IAChF,MAAM,EAAEC,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC;IAC1C,MAAM,EAAEC,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC;IAC3C,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGJ,OAAOK,SAAS,CAACC,IAAI,KAAK,UAAU,MAAMJ,kBAAkBF,UAAU,MAAMC,iBAAiBD;IAEvHO,QAAQC,EAAE,CAAC,UAAU;QACnB,MAAMJ;QACNG,QAAQE,IAAI,CAAC;IACf;IAEAN,OAAOO,IAAI,CAAC,CAAC,oBAAoB,EAAEV,OAAOK,SAAS,CAACC,IAAI,CAAC,UAAU,CAAC;IACpE,MAAM,IAAIK,QAAQ,KAAO;AAC3B;AAEA,eAAe,eAAeC;IAC5B,4DAA4D;IAC5D,MAAMC,oBAAoBnB,kBAAkBa,QAAQO,IAAI;IACxD,IAAID,kBAAkBE,OAAO,EAAE;QAC7BC,QAAQC,GAAG,CAACJ,kBAAkBK,MAAM;QACpCX,QAAQE,IAAI,CAAC;IACf;IAEA,kGAAkG;IAClG,8FAA8F;IAC9F,MAAM,EAAEU,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC;IACtC,MAAMnB,SAASmB;IACf,MAAMpB,YAAYC;AACpB;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,YAAYC,GAAG,EAAEC,QAAQ,EAAE;IACzDV;AACF"}
@@ -0,0 +1,9 @@
1
+ import { type GoogleAuthProvider } from '@mcp-z/oauth-google';
2
+ /**
3
+ * A Google API client bound to this request's token provider.
4
+ *
5
+ * `@mcp-z/oauth-google` mints tokens and depends on no Google SDK, so the client
6
+ * is built here, from this package's own SDK. That keeps one copy of
7
+ * `google-auth-library` in the tree by construction rather than by matching pins.
8
+ */
9
+ export declare function googleAuth(auth: GoogleAuthProvider): import("google-auth-library").OAuth2Client;
@@ -0,0 +1,11 @@
1
+ import { auth as googleAuthPlus } from '@googleapis/drive';
2
+ import { attachTokenProvider } from '@mcp-z/oauth-google';
3
+ /**
4
+ * A Google API client bound to this request's token provider.
5
+ *
6
+ * `@mcp-z/oauth-google` mints tokens and depends on no Google SDK, so the client
7
+ * is built here, from this package's own SDK. That keeps one copy of
8
+ * `google-auth-library` in the tree by construction rather than by matching pins.
9
+ */ export function googleAuth(auth) {
10
+ return attachTokenProvider(new googleAuthPlus.OAuth2(), auth);
11
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/lib/google-auth.ts"],"sourcesContent":["import { auth as googleAuthPlus } from '@googleapis/drive';\nimport { attachTokenProvider, type GoogleAuthProvider } from '@mcp-z/oauth-google';\n\n/**\n * A Google API client bound to this request's token provider.\n *\n * `@mcp-z/oauth-google` mints tokens and depends on no Google SDK, so the client\n * is built here, from this package's own SDK. That keeps one copy of\n * `google-auth-library` in the tree by construction rather than by matching pins.\n */\nexport function googleAuth(auth: GoogleAuthProvider) {\n return attachTokenProvider(new googleAuthPlus.OAuth2(), auth);\n}\n"],"names":["auth","googleAuthPlus","attachTokenProvider","googleAuth","OAuth2"],"mappings":"AAAA,SAASA,QAAQC,cAAc,QAAQ,oBAAoB;AAC3D,SAASC,mBAAmB,QAAiC,sBAAsB;AAEnF;;;;;;CAMC,GACD,OAAO,SAASC,WAAWH,IAAwB;IACjD,OAAOE,oBAAoB,IAAID,eAAeG,MAAM,IAAIJ;AAC1D"}
@@ -1,5 +1,4 @@
1
- import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
2
- import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
1
+ import type { ServerContext } from '@mcp-z/server';
3
2
  export default function createPrompt(): {
4
3
  name: string;
5
4
  config: {
@@ -7,7 +6,7 @@ export default function createPrompt(): {
7
6
  };
8
7
  handler: (_args: {
9
8
  [x: string]: unknown;
10
- }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<{
9
+ }, _extra: ServerContext) => Promise<{
11
10
  messages: {
12
11
  role: "user";
13
12
  content: {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Google Drive query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Google Drive Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## File/Folder Fields\n- \\`name\\`: Search by name (partial match, case-insensitive)\n- \\`mimeType\\`: Filter by MIME type\n- \\`fullText\\`: Search file content and metadata\n- \\`parentId\\`: Search within folder (use \"root\" for My Drive)\n- \\`owner\\`: Filter by owner email\n\n## Boolean Flags\n- \\`starred\\`: true/false\n- \\`sharedWithMe\\`: true/false\n- \\`trashed\\`: true/false\n\n## Date Range\n\\`\\`\\`json\n{ \"modifiedTime\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Common MIME Types\n- \\`application/vnd.google-apps.folder\\`: Folders\n- \\`application/vnd.google-apps.document\\`: Google Docs\n- \\`application/vnd.google-apps.spreadsheet\\`: Google Sheets\n- \\`application/vnd.google-apps.presentation\\`: Google Slides\n- \\`application/pdf\\`: PDF files\n- \\`image/jpeg\\`, \\`image/png\\`: Images\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Escape Hatch\n- \\`rawDriveQuery\\`: Raw Google Drive query syntax\n\n## Example Queries\n\\`\\`\\`json\n// PDFs modified this year\n{ \"mimeType\": \"application/pdf\", \"modifiedTime\": { \"$gte\": \"2024-01-01\" } }\n\n// Starred spreadsheets\n{ \"mimeType\": \"application/vnd.google-apps.spreadsheet\", \"starred\": true }\n\n// Files in specific folder\n{ \"parentId\": \"1abc123xyz\" }\n\n// Search by name\n{ \"name\": \"budget\" }\n\n// Complex: shared PDFs or Docs\n{ \"$or\": [\n { \"mimeType\": \"application/pdf\", \"sharedWithMe\": true },\n { \"mimeType\": \"application/vnd.google-apps.document\", \"sharedWithMe\": true }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":"AAIA,eAAe,SAASA;IACtB,MAAMC,SAAS;QACbC,aAAa;IACf;IAEA,MAAMC,UAAU,OAAOC,OAAiCC;QACtD,OAAO;YACLC,UAAU;gBACR;oBACEC,MAAM;oBACNC,SAAS;wBACPC,MAAM;wBACNC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2Db,CAAC;oBACG;gBACF;aACD;QACH;IACF;IAEA,OAAO;QACLC,MAAM;QACNV;QACAE;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-drive/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule, ServerContext } from '@mcp-z/server';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Google Drive query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: ServerContext) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Google Drive Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## File/Folder Fields\n- \\`name\\`: Search by name (partial match, case-insensitive)\n- \\`mimeType\\`: Filter by MIME type\n- \\`fullText\\`: Search file content and metadata\n- \\`parentId\\`: Search within folder (use \"root\" for My Drive)\n- \\`owner\\`: Filter by owner email\n\n## Boolean Flags\n- \\`starred\\`: true/false\n- \\`sharedWithMe\\`: true/false\n- \\`trashed\\`: true/false\n\n## Date Range\n\\`\\`\\`json\n{ \"modifiedTime\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Common MIME Types\n- \\`application/vnd.google-apps.folder\\`: Folders\n- \\`application/vnd.google-apps.document\\`: Google Docs\n- \\`application/vnd.google-apps.spreadsheet\\`: Google Sheets\n- \\`application/vnd.google-apps.presentation\\`: Google Slides\n- \\`application/pdf\\`: PDF files\n- \\`image/jpeg\\`, \\`image/png\\`: Images\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Escape Hatch\n- \\`rawDriveQuery\\`: Raw Google Drive query syntax\n\n## Example Queries\n\\`\\`\\`json\n// PDFs modified this year\n{ \"mimeType\": \"application/pdf\", \"modifiedTime\": { \"$gte\": \"2024-01-01\" } }\n\n// Starred spreadsheets\n{ \"mimeType\": \"application/vnd.google-apps.spreadsheet\", \"starred\": true }\n\n// Files in specific folder\n{ \"parentId\": \"1abc123xyz\" }\n\n// Search by name\n{ \"name\": \"budget\" }\n\n// Complex: shared PDFs or Docs\n{ \"$or\": [\n { \"mimeType\": \"application/pdf\", \"sharedWithMe\": true },\n { \"mimeType\": \"application/vnd.google-apps.document\", \"sharedWithMe\": true }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":"AAEA,eAAe,SAASA;IACtB,MAAMC,SAAS;QACbC,aAAa;IACf;IAEA,MAAMC,UAAU,OAAOC,OAAiCC;QACtD,OAAO;YACLC,UAAU;gBACR;oBACEC,MAAM;oBACNC,SAAS;wBACPC,MAAM;wBACNC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2Db,CAAC;oBACG;gBACF;aACD;QACH;IACF;IAEA,OAAO;QACLC,MAAM;QACNV;QACAE;IACF;AACF"}