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
JavaScript
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