import type { FastMCP } from 'fastmcp';
import { UserError } from 'fastmcp';
import { z } from 'zod';
import { google } from 'googleapis';
import { getAuthClient } from '../../../clients.js';
import { DocumentIdParameter } from '../../../types.js';
export function register(server: FastMCP) {
server.addTool({
name: 'resolveComment',
description:
'Marks a comment as resolved. Note: resolved status may not persist in the Google Docs UI due to a Drive API limitation.',
parameters: DocumentIdParameter.extend({
commentId: z.string().describe('The ID of the comment to resolve'),
}),
execute: async (args, { log }) => {
log.info(`Resolving comment ${args.commentId} in doc ${args.documentId}`);
try {
const authClient = await getAuthClient();
const drive = google.drive({ version: 'v3', auth: authClient });
// First, get the current comment content (required by the API)
const currentComment = await drive.comments.get({
fileId: args.documentId,
commentId: args.commentId,
fields: 'content',
});
// Update with both content and resolved status
await drive.comments.update({
fileId: args.documentId,
commentId: args.commentId,
fields: 'id,resolved',
requestBody: {
content: currentComment.data.content,
resolved: true,
},
});
// Verify the resolved status was set
const verifyComment = await drive.comments.get({
fileId: args.documentId,
commentId: args.commentId,
fields: 'resolved',
});
if (verifyComment.data.resolved) {
return `Comment ${args.commentId} has been marked as resolved.`;
} else {
return `Attempted to resolve comment ${args.commentId}, but the resolved status may not persist in the Google Docs UI due to API limitations. The comment can be resolved manually in the Google Docs interface.`;
}
} catch (error: any) {
log.error(`Error resolving comment: ${error.message || error}`);
const errorDetails =
error.response?.data?.error?.message || error.message || 'Unknown error';
const errorCode = error.response?.data?.error?.code;
throw new UserError(
`Failed to resolve comment: ${errorDetails}${errorCode ? ` (Code: ${errorCode})` : ''}`
);
}
},
});
}