UNPKG

@chinchillaenterprises/mcp-upwork

Version:

Modular Upwork MCP server for job search and proposal management via Upwork API

54 lines (48 loc) 1.94 kB
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 messages and conversations", inputSchema: { type: "object", properties: { thread_id: { type: "string", description: "Filter by conversation thread" }, unread_only: { type: "boolean", default: false, description: "Show only unread messages" }, page: { type: "number", minimum: 1, default: 1, description: "Page number" }, limit: { type: "number", minimum: 1, maximum: 100, default: 20, description: "Results per page" } } } }; export async function listMessagesHandler(args: unknown, upworkClient: UpworkClient) { const validatedArgs = ListMessagesArgsSchema.parse(args); try { const params = new URLSearchParams(); if (validatedArgs.thread_id) params.append('thread_id', validatedArgs.thread_id); if (validatedArgs.unread_only) params.append('unread_only', 'true'); params.append('page', validatedArgs.page.toString()); params.append('count', validatedArgs.limit.toString()); const response = await upworkClient.getClient().get(`/messages/v3/rooms?${params.toString()}`); return { content: [ { type: "text", text: JSON.stringify({ success: true, messages: response.data.rooms || response.data.messages || [], total: response.data.total || 0, page: validatedArgs.page, limit: validatedArgs.limit }, null, 2) } ] }; } catch (error) { throw upworkClient.handleError(error); } } export const listMessagesTool = { definition: listMessagesToolDefinition, handler: listMessagesHandler, schema: ListMessagesArgsSchema };