@chinchillaenterprises/mcp-upwork
Version:
Modular Upwork MCP server for job search and proposal management via Upwork API
54 lines (48 loc) • 1.94 kB
text/typescript
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
};