UNPKG

@chinchillaenterprises/mcp-upwork

Version:

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

52 lines (46 loc) 1.87 kB
import { Tool } from "@modelcontextprotocol/sdk/types.js"; import { ListProposalsArgsSchema, ListProposalsArgs } from "../../schemas/upwork.js"; import { UpworkClient } from "../../services/upwork-client.js"; export const listProposalsToolDefinition: Tool = { name: "upwork_list_proposals", description: "List your submitted proposals", inputSchema: { type: "object", properties: { status: { type: "string", enum: ["active", "submitted", "interviewing", "offered", "hired", "ended", "declined"], description: "Filter by proposal status" }, 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 listProposalsHandler(args: unknown, upworkClient: UpworkClient) { const validatedArgs = ListProposalsArgsSchema.parse(args); try { const params = new URLSearchParams(); if (validatedArgs.status) params.append('status', validatedArgs.status); params.append('page', validatedArgs.page.toString()); params.append('count', validatedArgs.limit.toString()); const response = await upworkClient.getClient().get(`/profiles/v1/contractors/offers?${params.toString()}`); return { content: [ { type: "text", text: JSON.stringify({ success: true, proposals: response.data.offers || response.data.applications || [], total: response.data.total || 0, page: validatedArgs.page, limit: validatedArgs.limit }, null, 2) } ] }; } catch (error) { throw upworkClient.handleError(error); } } export const listProposalsTool = { definition: listProposalsToolDefinition, handler: listProposalsHandler, schema: ListProposalsArgsSchema };