@mcp-z/mcp-drive 1.1.4 → 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.
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/google-auth.d.cts +9 -0
- package/dist/cjs/lib/google-auth.d.ts +9 -0
- package/dist/cjs/lib/google-auth.js +16 -0
- package/dist/cjs/lib/google-auth.js.map +1 -0
- package/dist/cjs/mcp/prompts/query-syntax.d.cts +2 -3
- package/dist/cjs/mcp/prompts/query-syntax.d.ts +2 -3
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/resources/file.d.cts +2 -9
- package/dist/cjs/mcp/resources/file.d.ts +2 -9
- package/dist/cjs/mcp/resources/file.js +8 -6
- package/dist/cjs/mcp/resources/file.js.map +1 -1
- package/dist/cjs/mcp/tools/file-move-to-trash.d.cts +1 -1
- package/dist/cjs/mcp/tools/file-move-to-trash.d.ts +1 -1
- package/dist/cjs/mcp/tools/file-move-to-trash.js +9 -7
- package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/file-move.d.cts +1 -1
- package/dist/cjs/mcp/tools/file-move.d.ts +1 -1
- package/dist/cjs/mcp/tools/file-move.js +15 -10
- package/dist/cjs/mcp/tools/file-move.js.map +1 -1
- package/dist/cjs/mcp/tools/file-upload.d.cts +1 -1
- package/dist/cjs/mcp/tools/file-upload.d.ts +1 -1
- package/dist/cjs/mcp/tools/file-upload.js +9 -7
- package/dist/cjs/mcp/tools/file-upload.js.map +1 -1
- package/dist/cjs/mcp/tools/files-search.d.cts +1 -1
- package/dist/cjs/mcp/tools/files-search.d.ts +1 -1
- package/dist/cjs/mcp/tools/files-search.js +14 -8
- package/dist/cjs/mcp/tools/files-search.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-contents.d.cts +1 -1
- package/dist/cjs/mcp/tools/folder-contents.d.ts +1 -1
- package/dist/cjs/mcp/tools/folder-contents.js +14 -8
- package/dist/cjs/mcp/tools/folder-contents.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-create.d.cts +1 -1
- package/dist/cjs/mcp/tools/folder-create.d.ts +1 -1
- package/dist/cjs/mcp/tools/folder-create.js +11 -8
- package/dist/cjs/mcp/tools/folder-create.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-path.d.cts +1 -1
- package/dist/cjs/mcp/tools/folder-path.d.ts +1 -1
- package/dist/cjs/mcp/tools/folder-path.js +9 -7
- package/dist/cjs/mcp/tools/folder-path.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-search.d.cts +1 -1
- package/dist/cjs/mcp/tools/folder-search.d.ts +1 -1
- package/dist/cjs/mcp/tools/folder-search.js +18 -10
- package/dist/cjs/mcp/tools/folder-search.js.map +1 -1
- package/dist/cjs/setup/http.d.cts +0 -2
- package/dist/cjs/setup/http.d.ts +0 -2
- package/dist/cjs/setup/http.js +18 -11
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/cjs/setup/stdio.d.cts +0 -2
- package/dist/cjs/setup/stdio.d.ts +0 -2
- package/dist/cjs/setup/stdio.js +18 -11
- package/dist/cjs/setup/stdio.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/google-auth.d.ts +9 -0
- package/dist/esm/lib/google-auth.js +11 -0
- package/dist/esm/lib/google-auth.js.map +1 -0
- package/dist/esm/mcp/prompts/query-syntax.d.ts +2 -3
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/esm/mcp/resources/file.d.ts +2 -9
- package/dist/esm/mcp/resources/file.js +7 -5
- package/dist/esm/mcp/resources/file.js.map +1 -1
- package/dist/esm/mcp/tools/file-move-to-trash.d.ts +1 -1
- package/dist/esm/mcp/tools/file-move-to-trash.js +9 -7
- package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -1
- package/dist/esm/mcp/tools/file-move.d.ts +1 -1
- package/dist/esm/mcp/tools/file-move.js +15 -10
- package/dist/esm/mcp/tools/file-move.js.map +1 -1
- package/dist/esm/mcp/tools/file-upload.d.ts +1 -1
- package/dist/esm/mcp/tools/file-upload.js +9 -7
- package/dist/esm/mcp/tools/file-upload.js.map +1 -1
- package/dist/esm/mcp/tools/files-search.d.ts +1 -1
- package/dist/esm/mcp/tools/files-search.js +15 -9
- package/dist/esm/mcp/tools/files-search.js.map +1 -1
- package/dist/esm/mcp/tools/folder-contents.d.ts +1 -1
- package/dist/esm/mcp/tools/folder-contents.js +15 -9
- package/dist/esm/mcp/tools/folder-contents.js.map +1 -1
- package/dist/esm/mcp/tools/folder-create.d.ts +1 -1
- package/dist/esm/mcp/tools/folder-create.js +11 -8
- package/dist/esm/mcp/tools/folder-create.js.map +1 -1
- package/dist/esm/mcp/tools/folder-path.d.ts +1 -1
- package/dist/esm/mcp/tools/folder-path.js +9 -7
- package/dist/esm/mcp/tools/folder-path.js.map +1 -1
- package/dist/esm/mcp/tools/folder-search.d.ts +1 -1
- package/dist/esm/mcp/tools/folder-search.js +19 -11
- package/dist/esm/mcp/tools/folder-search.js.map +1 -1
- package/dist/esm/setup/http.d.ts +0 -2
- package/dist/esm/setup/http.js +18 -11
- package/dist/esm/setup/http.js.map +1 -1
- package/dist/esm/setup/stdio.d.ts +0 -2
- package/dist/esm/setup/stdio.js +18 -11
- package/dist/esm/setup/stdio.js.map +1 -1
- package/package.json +8 -9
|
@@ -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
|
|
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 '@
|
|
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 '@
|
|
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 =
|
|
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
|
|
699
|
-
throw new
|
|
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
|
}>;
|
package/dist/cjs/setup/http.d.ts
CHANGED
|
@@ -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
|
}>;
|
package/dist/cjs/setup/http.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
(
|
|
200
|
-
|
|
201
|
-
|
|
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)(
|
|
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
|
|
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
|
}>;
|
package/dist/cjs/setup/stdio.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
(
|
|
191
|
-
|
|
192
|
-
|
|
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)(
|
|
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
|
|
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 @
|
|
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');
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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 @
|
|
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 {
|
|
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:
|
|
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';\
|
|
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"}
|