Skip to main content
Glama
fieldjoshua

Upwork MCP Server

by fieldjoshua

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PORTNoPort for HTTP mode (default: 3000)3000
TRANSPORTNoTransport mode: 'stdio' (default) or 'http'stdio
UPWORK_ACCESS_TOKENYesYour Upwork OAuth2 access token

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
upwork_search_jobsA

Search for freelance jobs on Upwork with various filters.

This tool searches the Upwork job marketplace and returns matching job listings. Use it to find opportunities based on skills, budget, category, and more.

Args:

  • query (string, optional): Search keywords for job titles/descriptions

  • category (string, optional): Job category filter

  • skills (string[], optional): Filter by required skills

  • budget_min (number, optional): Minimum budget in USD

  • budget_max (number, optional): Maximum budget in USD

  • job_type ('hourly' | 'fixed', optional): Filter by job type

  • experience_level ('entry' | 'intermediate' | 'expert', optional): Filter by level

  • client_country (string, optional): Filter by client's country

  • posted_within_hours (number, optional): Jobs posted within N hours

  • payment_verified (boolean, optional): Only verified payment methods

  • limit (number): Max results (default: 20, max: 100)

  • offset (number): Pagination offset (default: 0)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: List of matching jobs with details including title, budget, skills, client info, and posting date.

Examples:

  • Find React jobs: query="react developer", skills=["react", "javascript"]

  • High-budget fixed jobs: job_type="fixed", budget_min=1000

  • Recent expert jobs: experience_level="expert", posted_within_hours=24

Error Handling:

  • Returns "No jobs found" if search returns empty

  • Returns error message if authentication fails

upwork_get_jobA

Get detailed information about a specific Upwork job.

Retrieves complete job details including full description, client history, and requirements.

Args:

  • job_id (string, required): The unique job identifier

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: Complete job details including description, budget, skills, client info, and application requirements.

Examples:

  • Get job details: job_id="~01abc123def456"

upwork_list_saved_jobsA

List jobs you've saved/favorited on Upwork.

Retrieves your saved jobs list for easy access to opportunities you're interested in.

Args:

  • limit (number): Max results (default: 20, max: 100)

  • offset (number): Pagination offset (default: 0)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: List of your saved jobs with basic details.

upwork_save_jobA

Save a job to your favorites or remove it from saved jobs.

Use this to bookmark jobs you want to apply to later.

Args:

  • job_id (string, required): The job ID to save/unsave

  • save (boolean): True to save, false to remove (default: true)

Returns: Confirmation of the save/unsave action.

upwork_get_job_recommendationsA

Get personalized job recommendations based on your profile and history.

Returns jobs that Upwork's algorithm thinks are a good match for your skills and experience.

Args:

  • limit (number): Max recommendations (default: 20, max: 100)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: List of recommended jobs tailored to your profile.

upwork_list_proposalsA

List your submitted proposals on Upwork.

View all your job applications and their current status.

Args:

  • status (string, optional): Filter by status: 'pending', 'accepted', 'declined', 'withdrawn', 'archived'

  • limit (number): Max results (default: 20, max: 100)

  • offset (number): Pagination offset (default: 0)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: List of proposals with job titles, bid amounts, and status.

Examples:

  • All pending proposals: status="pending"

  • Recent accepted proposals: status="accepted", limit=10

upwork_get_proposalA

Get detailed information about a specific proposal.

Retrieve the full proposal including cover letter, answers to screening questions, and current status.

Args:

  • proposal_id (string, required): The proposal ID

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: Complete proposal details including cover letter, bid, and status.

upwork_submit_proposalA

Submit a proposal (application) for a job on Upwork.

Apply to a job with your cover letter and bid. This will use Connects from your account.

Args:

  • job_id (string, required): The job ID to apply to

  • cover_letter (string, required): Your cover letter (50-5000 characters)

  • bid_amount (number, required): Your bid in USD

  • bid_type ('hourly' | 'fixed', required): Type of bid

  • estimated_duration (string, optional): Estimated time to complete

  • answers (array, optional): Answers to screening questions

  • attachments (array, optional): Files to attach

Returns: Confirmation with proposal ID and Connects used.

Examples:

  • Submit hourly proposal: job_id="~01abc", cover_letter="...", bid_amount=50, bid_type="hourly"

  • Submit fixed proposal: job_id="~01abc", cover_letter="...", bid_amount=500, bid_type="fixed"

Important:

  • Submitting proposals costs Connects

  • Review job requirements carefully before submitting

  • Customize your cover letter for each job

upwork_update_proposalA

Update an existing proposal.

Modify your cover letter or bid amount before the client responds.

Args:

  • proposal_id (string, required): The proposal ID to update

  • cover_letter (string, optional): Updated cover letter

  • bid_amount (number, optional): Updated bid amount

  • estimated_duration (string, optional): Updated duration

Returns: Confirmation of the update.

Note: You can only update proposals that are still pending.

upwork_withdraw_proposalA

Withdraw a submitted proposal.

Remove your application from a job. Note that some Connects may not be refunded.

Args:

  • proposal_id (string, required): The proposal ID to withdraw

  • reason (string, optional): Reason for withdrawal

Returns: Confirmation of withdrawal and any Connects refunded.

Important: Withdrawn proposals cannot be undone. You would need to submit a new proposal.

upwork_get_proposal_statsA

Get statistics about your proposal activity.

View your proposal success rate, response times, and trends.

Args:

  • period_days (number): Days to include (default: 30, max: 365)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: Statistics including total proposals, acceptance rate, and average response time.

upwork_list_contractsA

List your contracts on Upwork.

View all your freelance contracts with clients.

Args:

  • status (string, optional): Filter by status: 'active', 'paused', 'ended', 'pending'

  • client_id (string, optional): Filter by specific client

  • limit (number): Max results (default: 20, max: 100)

  • offset (number): Pagination offset (default: 0)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: List of contracts with client info, earnings, and status.

Examples:

  • Active contracts only: status="active"

  • All contracts: (no filters)

upwork_get_contractA

Get detailed information about a specific contract.

Retrieve complete contract details including terms, milestones, and feedback.

Args:

  • contract_id (string, required): The contract ID

  • include_milestones (boolean): Include milestone details (default: true)

  • include_feedback (boolean): Include feedback details (default: true)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: Complete contract details including payment terms, milestones, and client feedback.

upwork_get_work_diaryA

Get work diary entries for an hourly contract.

View time tracked, screenshots, and activity levels for hourly work.

Args:

  • contract_id (string, required): The contract ID

  • date (string, optional): Specific date in YYYY-MM-DD format

  • start_date (string, optional): Start of date range (YYYY-MM-DD)

  • end_date (string, optional): End of date range (YYYY-MM-DD)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: Work diary entries with time tracked, memos, and activity data.

Note: Only works for hourly contracts with time tracking enabled.

upwork_list_milestonesA

List milestones for a fixed-price contract.

View all milestones, their status, and amounts.

Args:

  • contract_id (string, required): The contract ID

  • status (string, optional): Filter by status: 'active', 'submitted', 'approved', 'paid', 'cancelled'

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: List of milestones with descriptions, amounts, and status.

upwork_submit_milestoneA

Submit work for a milestone on a fixed-price contract.

Mark a milestone as complete and ready for client review.

Args:

  • contract_id (string, required): The contract ID

  • milestone_id (string, required): The milestone ID to submit

  • message (string, optional): Message to the client about the submission

Returns: Confirmation of submission.

Important: Only submit when work is complete. The client will review and approve or request changes.

upwork_request_paymentA

Request payment for work completed.

For hourly contracts, request payment for tracked hours. For fixed-price, request milestone payment.

Args:

  • contract_id (string, required): The contract ID

  • milestone_id (string, optional): Milestone ID for fixed-price contracts

  • amount (number, optional): Amount for hourly contracts

  • message (string, optional): Message to client

Returns: Confirmation of payment request.

upwork_end_contractA

End an active contract.

Close a contract and optionally leave feedback for the client.

Args:

  • contract_id (string, required): The contract ID to end

  • reason (string, required): Reason - 'project_completed', 'project_cancelled', 'no_longer_needed', 'other'

  • feedback_rating (number, optional): Rating for client (1-5)

  • feedback_comment (string, optional): Feedback comment

  • would_recommend (boolean, optional): Would you recommend this client?

Returns: Confirmation of contract closure.

Important: This action cannot be undone. Make sure all work is complete and payments are settled.

upwork_get_profileA

Get your Upwork freelancer profile information.

Retrieve your profile details including title, skills, stats, and availability.

Args:

  • user_id (string, optional): User ID to fetch. Defaults to your profile.

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: Complete profile with overview, skills, earnings stats, and availability.

upwork_update_profileA

Update your Upwork freelancer profile.

Modify your professional title, overview, hourly rate, skills, or availability.

Args:

  • title (string, optional): Professional title (10-100 chars)

  • overview (string, optional): Professional bio (100-5000 chars)

  • hourly_rate (number, optional): Desired hourly rate in USD

  • skills (string[], optional): List of skills (1-15)

  • availability (string, optional): 'available', 'not_available', 'open_to_offers'

  • hours_per_week (number, optional): Available hours per week (0-80)

Returns: Confirmation of profile update.

Tips:

  • Keep your title specific and keyword-rich

  • Update your availability regularly

  • Add skills that match job requirements

upwork_get_earningsA

Get your earnings report for a time period.

View earnings summary, breakdown by contract, and pending/escrow amounts.

Args:

  • start_date (string, optional): Start date YYYY-MM-DD (default: 30 days ago)

  • end_date (string, optional): End date YYYY-MM-DD (default: today)

  • contract_id (string, optional): Filter by specific contract

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: Earnings summary with totals, averages, and per-contract breakdown.

upwork_get_transactionsB

Get your transaction history.

View all financial transactions including earnings, withdrawals, and fees.

Args:

  • start_date (string, optional): Start date YYYY-MM-DD

  • end_date (string, optional): End date YYYY-MM-DD

  • type (string, optional): Filter by type: 'earning', 'withdrawal', 'refund', 'bonus', 'fee'

  • limit (number): Max results (default: 20, max: 100)

  • offset (number): Pagination offset (default: 0)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: List of transactions with amounts, types, and dates.

upwork_get_connectsA

Get your Connects balance.

View your current Connects balance and usage history.

Args:

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: Current Connects balance and recent usage.

upwork_get_job_success_scoreB

Get your Job Success Score (JSS) and related metrics.

View your JSS, factors affecting it, and tips for improvement.

Args:

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: Current JSS, calculation factors, and historical trend.

upwork_list_messagesB

List your message conversations on Upwork.

View your message rooms with clients and other freelancers.

Args:

  • room_id (string, optional): Get messages from a specific room

  • contract_id (string, optional): Filter by contract

  • unread_only (boolean): Only show rooms with unread messages (default: false)

  • limit (number): Max results (default: 20, max: 100)

  • offset (number): Pagination offset (default: 0)

  • response_format ('markdown' | 'json'): Output format (default: 'markdown')

Returns: List of message rooms with participants and last message preview.

upwork_send_messageA

Send a message in a conversation room.

Send a message to a client or in a job/contract conversation.

Args:

  • room_id (string, required): The conversation room ID

  • content (string, required): Message content (1-10000 chars)

  • attachments (string[], optional): File URLs to attach (max 5)

Returns: Confirmation of message sent.

Important: Keep messages professional and relevant to the work.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.8/5.0

Scored across 26 tools

Disambiguation5/5

Every tool maps to a distinct resource+action: job discovery, proposal lifecycle, contract management, financial metrics, profile, and messaging are cleanly separated. Even close pairs like get_earnings and get_transactions are clearly differentiated as summary versus detailed ledger, so an agent should not misselect.

Naming Consistency5/5

All tools share the upwork_ prefix and use a consistent verb_noun pattern such as search_jobs, submit_proposal, end_contract, and send_message. There are no mixed casing styles, vague action verbs, or unpredictable naming deviations.

Tool Count3/5

At 26 tools, the server is at the upper edge of what is reasonable and feels heavy, but the tools span the full freelancer lifecycle from job search through proposals, contracts, payments, and messaging. Most tools earn their place, so the count is borderline rather than egregiously bloated.

Completeness4/5

The core freelancer workflow is well covered: search and save jobs, submit and manage proposals, handle contracts, track work, request payment, and review financial metrics. Minor gaps like accepting client offers or managing client reviews mean some edge workflows still have dead ends.

Maintenance

ActivityInactive
ResponsivenessNo issues