UNPKG

mcp-google-drive

Version:

Advanced MCP server for Google Drive integration with full CRUD operations, file management, and sharing capabilities. Supports both OAuth2 and Service Account authentication.

64 lines 2.54 kB
import { z } from "zod"; import { BaseToolHandler } from "./BaseToolHandler.js"; // Schema for get file arguments const GetFileSchema = z.object({ fileId: z.string(), includeContent: z.boolean().default(false), includePermissions: z.boolean().default(false), }); export class GetFileHandler extends BaseToolHandler { async runTool(args, drive) { const validArgs = GetFileSchema.parse(args); console.error(`[${new Date().toISOString()}] [DEBUG] MCP-Google-Drive: Getting file: ${validArgs.fileId}`); const file = await this.getFile(validArgs, drive); return { content: [{ type: "text", text: this.formatFileInfo(file, validArgs), }], isError: false, }; } async getFile(args, drive) { try { const fields = ['id,name,mimeType,modifiedTime,size,webViewLink,parents,description,owners']; if (args.includePermissions) { fields.push('permissions'); } const response = await drive.files.get({ fileId: args.fileId, fields: fields.join(','), supportsAllDrives: true, }); return response.data; } catch (error) { throw this.handleGoogleApiError(error); } } formatFileInfo(file, args) { const size = file.size ? `${Math.round(file.size / 1024)}KB` : 'N/A'; const modified = file.modifiedTime ? new Date(file.modifiedTime).toLocaleString() : 'N/A'; const link = file.webViewLink || 'N/A'; const description = file.description || 'No description'; let result = `**File Information** - **Name:** ${file.name} - **ID:** \`${file.id}\` - **Type:** ${file.mimeType} - **Size:** ${size} - **Modified:** ${modified} - **Link:** ${link} - **Description:** ${description}`; if (file.parents && file.parents.length > 0) { result += `\n- **Parent Folders:** ${file.parents.join(', ')}`; } if (file.owners && file.owners.length > 0) { result += `\n- **Owners:** ${file.owners.map((owner) => owner.emailAddress).join(', ')}`; } if (args.includePermissions && file.permissions) { result += `\n\n**Permissions:**\n${file.permissions.map((perm) => `- ${perm.emailAddress || perm.domain || 'Anyone'}: ${perm.role}`).join('\n')}`; } return result; } } //# sourceMappingURL=GetFileHandler.js.map