MCP Server for Upwork — job search, proposal submission, messaging automation
Server has 11 tools with explicit schemas and descriptions. Most tools have clear action verbs (search_, get_, submit_, send_, update_) and detailed descriptions (100-300 chars). However, several critical gaps: (1) manual_login and save_session have empty input schemas with no parameters documented; (2) parameter descriptions lack format constraints, ranges, and validation rules; (3) no output schemas documented for any tool, LLMs cannot plan downstream calls; (4) error handling descriptions are absent, no guidance on retryability or recovery; (5) some parameters accept multiple types (number|string) without clear format guidance. The analyze_job tool has the most comprehensive description but still lacks output schema. Overall: solid naming and descriptions, but missing output documentation and validation constraints that production tools require.
Analyze a job opportunity and score it across 5 dimensions to decide whether to apply. Scoring breakdown (100 pts max): - Niche Fit (30pts): How well the job matches n8n/automation keywords - Client Quality (25pts): Rating, total spent, hire rate, location - Budget Fit (20pts): Budget vs your target rate, estimated total project value - Competition (10pts): Number of existing proposals (fewer = better) - Project Clarity (10pts): How well-defined the scope is - Red Flag Penalty (-5pts each): Vague scope, low budget signals, no client history Returns: grade (A+/A/B/C/D/F), recommendation (APPLY NOW/APPLY/CONSIDER/SKIP/AVOID), suggested bid, estimated project value, key selling points, and proposal tips. RECOMMENDED WORKFLOW: 1. search_jobs → find candidates 2. get_job_details → get full info 3. analyze_job → score and decide 4. submit_proposal → if grade A or B
Get full details of a specific Upwork job posting. Returns complete description, all screening questions, client history (jobs posted, hire rate, spend), required skills, budget, and proposal stats. ALWAYS call this before submitting a proposal to get screening questions and understand client context.
Read Upwork messages. - Without room_id: lists all conversations with unread status and last message preview - With room_id: reads the full message history of that conversation Use this to check for client responses, new invitations, and ongoing contract discussions.
Get your Upwork freelancer profile, stats, and connects balance. Returns: name, title, skills, hourly rate, JSS score, Top Rated status, total earnings, connects balance. Use this to understand your current standing and available connects before bidding.
No output schemas documented for any tool. LLMs cannot infer response structure, field names, or types needed for downstream tool chaining. Forces agents to guess at response format.
manual_login and save_session have empty input schemas (no properties). While intentional for no-param tools, descriptions lack clarity on side effects, return values, and error conditions.
Parameters accepting multiple types (number|string) lack format guidance. E.g., budget_min, budget_max, bid_rate, limit, posted_within_days. Should specify: 'Positive integer, 1-10000' or 'ISO 8601 date string'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Get list of your submitted proposals on Upwork. Shows status, bid rate, submission date, and whether the client is interviewing you. Use this to track which proposals need follow-up.
Step 1: Open a visible browser window at Upwork login page. Returns immediately — you then login manually in the browser (solve CAPTCHA, enter credentials, handle 2FA). After login is complete, call save_session to persist the session.
Step 2: After manually logging in via manual_login, call this to save the browser session. Checks if login was successful and saves cookies/storage for future headless use. Must be called AFTER you have fully logged in to Upwork in the browser window.
Search for jobs on Upwork. Optimized for n8n workflow automation niche. Returns a list of jobs with title, budget, description snippet, required skills, client info, and proposal count. Use this to find potential clients and opportunities.
Send a message in an Upwork conversation. Use this to: - Reply to client questions about your proposal - Follow up on submitted proposals (after 3-5 days) - Clarify project requirements - Communicate during an active contract Keep messages professional, specific to the project, and value-adding.
Submit a proposal/bid for an Upwork job. Before calling this: 1. Call get_job_details to get screening questions 2. Craft a personalized cover letter that: - Opens with the client's specific problem (not "I am an expert in...") - Shows concrete n8n examples relevant to their use case - Mentions specific workflow patterns (HTTP Request, Webhook, Code node, etc.) - Ends with a clear CTA 3. Answer ALL screening questions thoughtfully The agent will automatically type and submit the proposal.
Update your Upwork freelancer profile fields. Can update: title, description/bio, hourly_rate, skills. Each field is optional — only provide what you want to change. Uses the edit buttons on your profile page (requires browser via connect-chrome.bat).
No error handling guidance in tool descriptions. Tools like submit_proposal, send_message, and update_profile modify state but lack recovery instructions. E.g., 'If proposal submission fails due to insufficient Connects, call get_profile to check balance.'
Parameter descriptions lack dependency hints. E.g., submit_proposal requires screening_answers but does not state 'Call get_job_details first to retrieve screening_questions.' Agents may pass empty arrays.