import type { FastMCP } from 'fastmcp'; import { UserError } from 'fastmcp'; import { google } from 'googleapis'; import { getDocsClient, getDriveClient, getAuthClient } from '../../../clients.js'; import { DocumentIdParameter } from '../../../types.js'; export function register(server: FastMCP) { server.addTool({ name: 'listComments', description: 'Lists all comments in a document with their IDs, authors, status, and quoted text. Returns data needed to call getComment, replyToComment, resolveComment, or deleteComment.', parameters: DocumentIdParameter, execute: async (args, { log }) => { log.info(`Listing comments for document ${args.documentId}`); const docsClient = await getDocsClient(); const driveClient = await getDriveClient(); try { // First get the document to have context const doc = await docsClient.documents.get({ documentId: args.documentId }); // Use Drive API v3 with proper fields to get quoted content const authClient = await getAuthClient(); const drive = google.drive({ version: 'v3', auth: authClient }); const response = await drive.comments.list({ fileId: args.documentId, fields: 'comments(id,content,quotedFileContent,author,createdTime,resolved)', pageSize: 100, }); const comments = (response.data.comments || []).map((comment: any) => ({ id: comment.id, author: comment.author?.displayName || null, content: comment.content, quotedText: comment.quotedFileContent?.value || null, resolved: comment.resolved || false, createdTime: comment.createdTime, modifiedTime: comment.modifiedTime, replyCount: comment.replies?.length || 0, })); return JSON.stringify({ comments }, null, 2); } catch (error: any) { log.error(`Error listing comments: ${error.message || error}`); throw new UserError(`Failed to list comments: ${error.message || 'Unknown error'}`); } }, }); }