import { Tool } from "@modelcontextprotocol/sdk/types.js"; import { ListMessagesArgsSchema, ListMessagesArgs } from "../../schemas/upwork.js"; import { UpworkClient } from "../../services/upwork-client.js"; export const listMessagesToolDefinition: Tool = { name: "upwork_list_messages", description: "List rooms/conversations with optional filtering", inputSchema: { type: "object", properties: { room_id: { type: "string", description: "Filter by specific room ID" }, unread_only: { type: "boolean", default: false, description: "Show only unread messages" }, limit: { type: "number", minimum: 1, maximum: 100, default: 20, description: "Number of rooms to return" } } } }; export async function listMessagesHandler(args: unknown, upworkClient: UpworkClient) { const validatedArgs = ListMessagesArgsSchema.parse(args); try { // Use GraphQL roomList query instead of REST const roomListQuery = ` query roomList($filter: RoomFilter, $pagination: Pagination) { roomList(filter: $filter, pagination: $pagination) { totalCount edges { node { id roomName lastActivity { timestamp user { id name } message } participants { id name role } unreadCount roomType } } pageInfo { hasNextPage hasPreviousPage startCursor endCursor } } } `; const variables: any = { pagination: { first: validatedArgs.limit } }; // Add filters if specified if (validatedArgs.room_id || validatedArgs.unread_only) { variables.filter = {}; if (validatedArgs.room_id) { variables.filter.roomId = validatedArgs.room_id; } if (validatedArgs.unread_only) { variables.filter.hasUnreadMessages = true; } } const response = await upworkClient.graphqlQuery(roomListQuery, variables); if (response.data?.roomList) { const rooms = response.data.roomList.edges.map((edge: any) => edge.node); return { content: [ { type: "text", text: `📬 **Upwork Conversations**\n\n` + `**Total Rooms**: ${response.data.roomList.totalCount}\n` + `**Showing**: ${rooms.length} rooms\n\n` + rooms.map((room: any, index: number) => `**${index + 1}. ${room.roomName || 'Unnamed Room'}**\n` + `🆔 **ID**: ${room.id}\n` + `👥 **Participants**: ${room.participants?.map((p: any) => p.name).join(', ') || 'None'}\n` + `📧 **Unread**: ${room.unreadCount || 0} messages\n` + `🏷️ **Type**: ${room.roomType || 'Unknown'}\n` + (room.lastActivity ? `💬 **Last**: ${room.lastActivity.message?.slice(0, 100)}${room.lastActivity.message?.length > 100 ? '...' : ''}\n` + `👤 **By**: ${room.lastActivity.user?.name || 'Unknown'}\n` : `💬 **Last**: No recent activity\n` ) + '\n' ).join('') } ] }; } else { throw new Error('No room data received from GraphQL response'); } } catch (error) { throw upworkClient.handleError(error); } } export const listMessagesTool = { definition: listMessagesToolDefinition, handler: listMessagesHandler, schema: ListMessagesArgsSchema };