UNPKG

@chinchillaenterprises/mcp-upwork

Version:

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

54 lines 2.38 kB
import { SubmitProposalArgsSchema } from "../../schemas/upwork.js"; export const submitProposalToolDefinition = { name: "upwork_submit_proposal", description: "Submit a proposal for a job", inputSchema: { type: "object", properties: { job_id: { type: "string", description: "Upwork job ID to submit proposal for" }, cover_letter: { type: "string", description: "Cover letter text" }, rate: { type: "number", description: "Proposed hourly rate or fixed price" }, estimated_duration: { type: "string", description: "Estimated project duration" }, milestone_description: { type: "string", description: "Milestone description for fixed-price projects" }, connects_to_use: { type: "number", minimum: 1, maximum: 10, default: 2, description: "Number of connects to spend" }, boost_proposal: { type: "boolean", default: false, description: "Use boosted proposal for top placement" } }, required: ["job_id", "cover_letter"] } }; export async function submitProposalHandler(args, upworkClient) { const validatedArgs = SubmitProposalArgsSchema.parse(args); try { const proposalData = { job_id: validatedArgs.job_id, cover_letter: validatedArgs.cover_letter, rate: validatedArgs.rate, estimated_duration: validatedArgs.estimated_duration, milestone_description: validatedArgs.milestone_description, connects_used: validatedArgs.connects_to_use, boost: validatedArgs.boost_proposal }; const response = await upworkClient.getClient().post('/profiles/v1/contractors/actions/apply', proposalData); return { content: [ { type: "text", text: JSON.stringify({ success: true, proposal: response.data, message: "Proposal submitted successfully" }, null, 2) } ] }; } catch (error) { throw upworkClient.handleError(error); } } export const submitProposalTool = { definition: submitProposalToolDefinition, handler: submitProposalHandler, schema: SubmitProposalArgsSchema }; //# sourceMappingURL=submit-proposal.js.map