import { Tool } from "@modelcontextprotocol/sdk/types.js"; import { GetContractDetailsArgsSchema } from "../../schemas/upwork.js"; import { UpworkClient } from "../../services/upwork-client.js"; import { z } from "zod"; export const toolDefinition: Tool = { name: "upwork_get_contract_details", description: "Get detailed information about a specific contract including terms, payments, and milestones", inputSchema: { type: "object", properties: { contract_id: { type: "string", description: "The unique identifier of the contract" } }, required: ["contract_id"] } }; export const handler = async (args: z.infer, upworkClient: UpworkClient) => { try { // Use proper GraphQL contractDetails query const contractDetailsQuery = ` query contractDetails($id: ID!, $date: String) { contractDetails(id: $id, date: $date) { id title status closingReason deliveryModel startDate endDate totalAmount weeklyLimit weeklyCommitment manualTimeAllowed rate { amount currency } terms { id title status startDate endDate weeklyLimit manualTimeAllowed rate { amount currency } } client { id name country avgPaymentTime totalSpent totalJobs } freelancer { id name country profileUrl } assignment { id title description jobPosting { id title category subcategory } } billingCode milestone { description amount dueDate status } } } `; const variables = { id: args.contract_id }; const response = await upworkClient.graphqlQuery(contractDetailsQuery, variables); if (response.data?.contractDetails) { const contract = response.data.contractDetails; return { content: [ { type: "text", text: `📄 **Contract Details**\n\n` + `**📋 Basic Info**\n` + `🆔 **ID**: ${contract.id}\n` + `📝 **Title**: ${contract.title || 'Untitled'}\n` + `📊 **Status**: ${contract.status || 'Unknown'}\n` + `🏗️ **Type**: ${contract.deliveryModel || 'Unknown'}\n` + (contract.closingReason ? `📞 **Closing**: ${contract.closingReason}\n` : '') + `\n**💰 Financial Details**\n` + `💵 **Rate**: ${contract.rate ? `$${contract.rate.amount} ${contract.rate.currency || 'USD'}` : 'Not specified'}\n` + `💰 **Total Amount**: ${contract.totalAmount ? `$${contract.totalAmount}` : 'N/A'}\n` + `⏰ **Weekly Limit**: ${contract.weeklyLimit ? `${contract.weeklyLimit}h` : 'No limit'}\n` + `🔧 **Manual Time**: ${contract.manualTimeAllowed ? 'Allowed' : 'Not allowed'}\n` + `\n**📅 Timeline**\n` + `🚀 **Started**: ${contract.startDate ? new Date(contract.startDate).toLocaleDateString() : 'Not started'}\n` + (contract.endDate ? `🏁 **Ended**: ${new Date(contract.endDate).toLocaleDateString()}\n` : '') + `\n**👥 People**\n` + `🏢 **Client**: ${contract.client?.name || 'Unknown'} (${contract.client?.country || 'Unknown'})\n` + `👤 **Freelancer**: ${contract.freelancer?.name || 'Unknown'} (${contract.freelancer?.country || 'Unknown'})\n` + `\n**🎯 Project**\n` + `📌 **Assignment**: ${contract.assignment?.title || 'No assignment'}\n` + (contract.assignment?.description ? `📄 **Description**: ${contract.assignment.description.slice(0, 200)}${contract.assignment.description.length > 200 ? '...' : ''}\n` : '') + (contract.assignment?.jobPosting ? `📋 **Original Job**: ${contract.assignment.jobPosting.title}\n` : '') + (contract.milestone ? `\n**🎯 Milestone**\n` + `📝 **Description**: ${contract.milestone.description || 'No description'}\n` + `💰 **Amount**: $${contract.milestone.amount || 0}\n` + `📅 **Due**: ${contract.milestone.dueDate ? new Date(contract.milestone.dueDate).toLocaleDateString() : 'No due date'}\n` + `📊 **Status**: ${contract.milestone.status || 'Unknown'}\n` : '' ) } ] }; } else { throw new Error('No contract data received from GraphQL response'); } } catch (error: any) { return { content: [ { type: "text", text: `❌ Error getting contract details: ${error.message}` } ], isError: true }; } }; export { GetContractDetailsArgsSchema as schema } from "../../schemas/upwork.js";