Spaces:
Sleeping
Sleeping
| import type { FastMCP } from 'fastmcp'; | |
| import { UserError } from 'fastmcp'; | |
| import { z } from 'zod'; | |
| import { getDriveClient } from '../../clients.js'; | |
| export function register(server: FastMCP) { | |
| server.addTool({ | |
| name: 'moveFile', | |
| description: | |
| 'Moves a file or folder to a different Drive folder. By default adds the new parent while keeping existing parents; set removeFromAllParents=true for a true move.', | |
| parameters: z.strictObject({ | |
| fileId: z | |
| .string() | |
| .describe('The file or folder ID from a Google Drive URL or a previous tool result.'), | |
| newParentId: z.string().describe('ID of the destination folder. Use "root" for Drive root.'), | |
| removeFromAllParents: z | |
| .boolean() | |
| .optional() | |
| .default(false) | |
| .describe( | |
| 'If true, removes from all current parents. If false, adds to new parent while keeping existing parents.' | |
| ), | |
| }), | |
| execute: async (args, { log }) => { | |
| const drive = await getDriveClient(); | |
| log.info(`Moving file ${args.fileId} to folder ${args.newParentId}`); | |
| try { | |
| // First get the current parents | |
| const fileInfo = await drive.files.get({ | |
| fileId: args.fileId, | |
| fields: 'name,parents', | |
| supportsAllDrives: true, | |
| }); | |
| const fileName = fileInfo.data.name; | |
| const currentParents = fileInfo.data.parents || []; | |
| let updateParams: any = { | |
| fileId: args.fileId, | |
| addParents: args.newParentId, | |
| fields: 'id,name,parents', | |
| supportsAllDrives: true, | |
| }; | |
| if (args.removeFromAllParents && currentParents.length > 0) { | |
| updateParams.removeParents = currentParents.join(','); | |
| } | |
| const response = await drive.files.update(updateParams); | |
| const action = args.removeFromAllParents ? 'moved' : 'copied'; | |
| return `Successfully ${action} "${fileName}" to new location.\nFile ID: ${response.data.id}`; | |
| } catch (error: any) { | |
| log.error(`Error moving file: ${error.message || error}`); | |
| if (error.code === 404) | |
| throw new UserError('File or destination folder not found. Check the IDs.'); | |
| if (error.code === 403) | |
| throw new UserError( | |
| 'Permission denied. Make sure you have write access to both source and destination.' | |
| ); | |
| throw new UserError(`Failed to move file: ${error.message || 'Unknown error'}`); | |
| } | |
| }, | |
| }); | |
| } | |