Upwork MCP Server
A Model Context Protocol (MCP) server for interacting with the Upwork freelance marketplace. Search jobs, manage proposals, track contracts, and monitor earnings - all through AI assistants like Claude.
Features
Job Search & Discovery
- Search Jobs: Find freelance opportunities with filters for skills, budget, category, experience level, and more
- Get Job Details: View complete job information including client history and requirements
- Save Jobs: Bookmark jobs for later review
- Get Recommendations: Personalized job suggestions based on your profile
Proposal Management
- Submit Proposals: Apply to jobs with cover letters and custom bids
- Track Proposals: Monitor proposal status (pending, accepted, declined)
- Update Proposals: Modify bids and cover letters before client response
- Withdraw Proposals: Cancel applications when needed
- View Statistics: Analyze your proposal success rates
Contract Management
- List Contracts: View all your active, paused, and completed contracts
- Contract Details: See terms, milestones, and feedback
- Work Diary: Track time logged on hourly contracts
- Milestones: Manage fixed-price project milestones
- Request Payment: Submit work and request payment
- End Contracts: Close contracts with feedback
Profile & Earnings
- View Profile: See your complete freelancer profile
- Update Profile: Modify title, skills, rate, and availability
- Earnings Reports: Detailed income breakdown by period and contract
- Transaction History: View all financial transactions
- Connects Balance: Monitor your proposal credits
- Job Success Score: Track your JSS and factors
Messaging
- List Conversations: View all message rooms with clients
- Read Messages: Access full conversation history
- Send Messages: Communicate with clients
Installation
# Clone or download the server
cd upwork-mcp-server
# Install dependencies
npm install
# Build the server
npm run build
Configuration
Getting Your Access Token
- Go to Upwork API Center
- Create a new API application or select an existing one
- Request OAuth 2.0 credentials
- Generate an access token with appropriate scopes
Environment Variables
# Required
UPWORK_ACCESS_TOKEN=your_oauth2_access_token
# Optional (for HTTP mode)
PORT=3000
TRANSPORT=http # or 'stdio' (default)
Usage
With Claude Desktop
Add to your Claude Desktop configuration (~/.config/claude/claude_desktop_config.json on macOS/Linux or %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"upwork": {
"command": "node",
"args": ["/path/to/upwork-mcp-server/dist/index.js"],
"env": {
"UPWORK_ACCESS_TOKEN": "your_token_here"
}
}
}
}
Command Line
# Run with stdio (default)
UPWORK_ACCESS_TOKEN=xxx npm start
# Run as HTTP server
UPWORK_ACCESS_TOKEN=xxx npm start -- --http
# Development mode with auto-reload
UPWORK_ACCESS_TOKEN=xxx npm run dev
HTTP API
When running in HTTP mode, the server exposes:
POST /mcp- MCP protocol endpointGET /health- Health check
Available Tools
Jobs
| Tool | Description | |------|-------------| | upwork_search_jobs | Search jobs with filters | | upwork_get_job | Get detailed job information | | upwork_list_saved_jobs | List your saved jobs | | upwork_save_job | Save/unsave a job | | upwork_get_job_recommendations | Get personalized recommendations |
Proposals
| Tool | Description | |------|-------------| | upwork_list_proposals | List your proposals | | upwork_get_proposal | Get proposal details | | upwork_submit_proposal | Submit a new proposal | | upwork_update_proposal | Update an existing proposal | | upwork_withdraw_proposal | Withdraw a proposal | | upwork_get_proposal_stats | Get proposal statistics |
Contracts
| Tool | Description | |------|-------------| | upwork_list_contracts | List your contracts | | upwork_get_contract | Get contract details | | upwork_get_work_diary | Get work diary entries | | upwork_list_milestones | List contract milestones | | upwork_submit_milestone | Submit milestone work | | upwork_request_payment | Request payment | | upwork_end_contract | End a contract |
Profile & Earnings
| Tool | Description | |------|-------------| | upwork_get_profile | Get freelancer profile | | upwork_update_profile | Update your profile | | upwork_get_earnings | Get earnings report | | upwork_get_transactions | Get transaction history | | upwork_get_connects | Get Connects balance | | upwork_get_job_success_score | Get your JSS |
Messages
| Tool | Description | |------|-------------| | upwork_list_messages | List message rooms/conversations | | upwork_send_message | Send a message |
Examples
Search for React Jobs
Use upwork_search_jobs with:
- query: "react developer"
- skills: ["react", "javascript", "typescript"]
- job_type: "hourly"
- experience_level: "intermediate"
Submit a Proposal
Use upwork_submit_proposal with:
- job_id: "~01abc123..."
- cover_letter: "Your personalized cover letter..."
- bid_amount: 50
- bid_type: "hourly"
Check Earnings
Use upwork_get_earnings with:
- start_date: "2024-01-01"
- end_date: "2024-12-31"
API Scopes
The server requires these Upwork API scopes:
job:read- Search and view jobsproposal:read,proposal:write- Manage proposalscontract:read,contract:write- Manage contractsprofile:read,profile:write- Access and update profileearning:read- View earningsmessage:read,message:write- Access messages
Development
# Install dependencies
npm install
# Run in development mode
npm run dev
# Build
npm run build
# Clean build artifacts
npm run clean
License
MIT











