import { Tool } from "@modelcontextprotocol/sdk/types.js"; import { SearchFreelancersArgsSchema } from "../../schemas/upwork.js"; import { UpworkClient } from "../../services/upwork-client.js"; export const searchFreelancersToolDefinition: Tool = { name: "upwork_search_freelancers", description: "Search for freelancers (client feature)", inputSchema: { type: "object", properties: { query: { type: "string", description: "Search query" }, skills: { type: "array", items: { type: "string" }, description: "Required skills" }, hourly_rate_min: { type: "number", description: "Minimum hourly rate" }, hourly_rate_max: { type: "number", description: "Maximum hourly rate" }, job_success_min: { type: "number", minimum: 0, maximum: 100, description: "Minimum job success score" }, earned_amount_min: { type: "number", description: "Minimum total earned" }, location: { type: "string", description: "Location filter" }, english_level: { type: "string", enum: ["basic", "conversational", "fluent", "native"], description: "English proficiency level" }, 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 searchFreelancersHandler(args: unknown, upworkClient: UpworkClient) { const validatedArgs = SearchFreelancersArgsSchema.parse(args); try { const params = new URLSearchParams(); if (validatedArgs.query) params.append('q', validatedArgs.query); if (validatedArgs.skills?.length) params.append('skills', validatedArgs.skills.join(';')); if (validatedArgs.hourly_rate_min) params.append('hourly_rate_min', validatedArgs.hourly_rate_min.toString()); if (validatedArgs.hourly_rate_max) params.append('hourly_rate_max', validatedArgs.hourly_rate_max.toString()); if (validatedArgs.job_success_min) params.append('job_success_min', validatedArgs.job_success_min.toString()); if (validatedArgs.earned_amount_min) params.append('earned_amount_min', validatedArgs.earned_amount_min.toString()); if (validatedArgs.location) params.append('location', validatedArgs.location); if (validatedArgs.english_level) params.append('english_level', validatedArgs.english_level); params.append('page', validatedArgs.page.toString()); params.append('count', validatedArgs.limit.toString()); const response = await upworkClient.getClient().get(`/profiles/v1/search/providers?${params.toString()}`); return { content: [ { type: "text", text: JSON.stringify({ success: true, freelancers: response.data.providers || [], total: response.data.total || 0, page: validatedArgs.page, limit: validatedArgs.limit }, null, 2) } ] }; } catch (error) { throw upworkClient.handleError(error); } } export const searchFreelancersTool = { definition: searchFreelancersToolDefinition, handler: searchFreelancersHandler, schema: SearchFreelancersArgsSchema };