MCP server for Upwork via browser automation
Project description
Upwork MCP Server
MCP server that lets AI agents search jobs, manage proposals, read messages, and track contracts on Upwork โ via real browser automation.
Table of Contents
- Quick Start
- Features
- How It Works
- Installation
- Authentication
- Available Tools
- Usage Examples
- CLI Reference
- Development
- Troubleshooting
- License
Quick Start
1. Add to your MCP config
Copy-paste this into your MCP client settings (Claude Code, Cursor, Claude Desktop, etc.):
{
"mcpServers": {
"upwork": {
"command": "uvx",
"args": ["upwork-mcp"]
}
}
}
2. Run the login flow (once)
uvx upwork-mcp --login
A browser window opens โ log in to Upwork and solve any CAPTCHA. Session cookies are saved automatically.
3. Start using it
Ask your AI agent: "Show my Upwork jobs", "Check my messages", "Submit a proposal to this job", etc.
Features
| Category | Capabilities |
|---|---|
| ๐ Jobs | Search by keyword, category, budget range, experience level, and job type |
| ๐ Proposals | View, submit, and withdraw proposals with cover letters |
| ๐ฌ Messages | Read inbox, view conversation history, send messages |
| ๐ค Contracts | View active/ended contracts, check work diary entries |
| ๐ค Profile | View freelancer profile, connects balance, JSS score, and earnings stats |
| ๐ก๏ธ Anti-detection | Uses Chrome DevTools Protocol (CDP) to bypass Cloudflare bot detection |
How It Works
Upwork blocks most automation tools through Cloudflare. This server sidesteps that by connecting to your real Chrome browser via CDP (Chrome DevTools Protocol):
AI Agent โ MCP Server (stdio) โ Chrome CDP โ Upwork (with your real cookies)
- No API keys needed โ uses your authenticated browser session
- Cloudflare bypass โ your real browser profile with history and cookies
- No headless bot โ runs inside your actual Chrome, not a detected automation browser
- Session persistence โ cookies survive between runs
Installation
Prerequisites
| Requirement | Version | Install |
|---|---|---|
| Python | โฅ 3.12 | python --version |
| uv | latest | pip install uv or official installer |
| Google Chrome | latest | Download |
Install from PyPI (recommended)
uvx upwork-mcp
That's it โ uvx downloads and runs it in an isolated environment. No clone, no install.
Install from source
git clone https://github.com/SARAMALI15792/Lead-upworkFTE.git
cd Lead-upworkFTE
uv sync
Authentication
First-time login
uvx upwork-mcp --login
This opens Chrome, navigates to Upwork, and waits for you to:
- Click the Cloudflare checkbox (if present)
- Enter your credentials
- Complete any CAPTCHA
Once logged in, session cookies are saved to ~/.upwork-mcp/.
Check session status
uvx upwork-mcp --check
Clear session (logout)
uvx upwork-mcp --logout
Tip: Run
--loginperiodically if your session expires. Upwork cookies typically last a few days.
Available Tools
Jobs
| Tool | Description |
|---|---|
upwork_search_jobs |
Search jobs with filters for query, category, budget, experience, type |
upwork_get_job_details |
Get full details for a specific job URL |
Proposals
| Tool | Description |
|---|---|
upwork_get_proposals |
List your submitted proposals (active/ended/archived) |
upwork_get_proposal_details |
Get cover letter, bid, and messages for a proposal |
upwork_submit_proposal |
Submit a new proposal to a job |
upwork_withdraw_proposal |
Withdraw an existing proposal |
Messages
| Tool | Description |
|---|---|
upwork_get_messages |
List inbox conversations |
upwork_get_conversation |
Get full message history for a conversation |
upwork_send_message |
Send a message in a conversation |
upwork_get_unread_count |
Get count of unread messages |
Contracts
| Tool | Description |
|---|---|
upwork_get_contracts |
List your contracts (active/ended/all) |
upwork_get_contract_details |
Get milestones, hours, and feedback for a contract |
upwork_get_work_diary |
Get work diary entries for a contract |
Profile & Session
| Tool | Description |
|---|---|
upwork_get_my_profile |
Get freelancer profile info (name, rate, skills, etc.) |
upwork_get_connects_balance |
Get available connects count |
upwork_get_profile_stats |
Get total earnings, hours worked, jobs completed |
upwork_check_session |
Verify if the saved browser session is still valid |
upwork_close_session |
Close the browser connection and clean up |
Usage Examples
Search for jobs
Search for Python developer jobs on Upwork with budget over $1000
Find entry-level fixed-price AI agent projects
Get job details
Get details for: https://www.upwork.com/jobs/~01234567890
Manage proposals
Show my active proposals
Submit a proposal to https://www.upwork.com/jobs/~01234567890
with a $500 bid and this cover letter: "I have 5 years of Python experience..."
Read and send messages
Check my Upwork messages
Reply to the last conversation: "Thanks, I'll get started right away"
Check contracts and earnings
Show my active contracts
What's my total earnings on Upwork?
CLI Reference
upwork-mcp [OPTIONS]
Options:
--login Open browser for manual Upwork login
--check Verify if the saved session is still valid
--logout Clear the saved browser session
--no-headless Show the browser window (useful for debugging)
--timeout MS Page timeout in milliseconds (default: 30000)
--transport MCP transport type (default: stdio)
Development
Project Structure
upwork-mcp/
โโโ pyproject.toml # Package config (hatchling build)
โโโ README.md
โโโ LICENSE
โโโ .gitignore
โโโ src/upwork_mcp/
โ โโโ __init__.py
โ โโโ server.py # MCP server entry point + CLI
โ โโโ browser/
โ โ โโโ __init__.py
โ โ โโโ client.py # Chrome CDP browser wrapper
โ โ โโโ auth.py # Interactive login flow
โ โ โโโ pages/
โ โ โโโ __init__.py # Page selectors and helpers
โ โโโ tools/
โ โ โโโ __init__.py
โ โ โโโ jobs.py # Job search & details
โ โ โโโ proposals.py # Proposal management
โ โ โโโ messages.py # Inbox & messaging
โ โ โโโ contracts.py # Contracts & work diary
โ โ โโโ profile.py # Profile, connects, stats
โ โโโ utils/
โ โโโ __init__.py
โ โโโ config.py # Configuration management
โ โโโ logging.py # Logging setup
โโโ scripts/
โ โโโ test_all.py # Integration test suite
โ โโโ debug_search.py # Search diagnostics
โ โโโ debug_search_path.py # Search pipeline smoke test
โ โโโ inspect_pages.py # Page structure inspection
โ โโโ test_search_direct.py # Direct search testing
โโโ tests/
โ โโโ conftest.py
โ โโโ test_browser.py
โ โโโ test_tools.py
โโโ uv.lock # Dependency lock file
Run tests
uv run python scripts/test_all.py
Build the package
uv build
Troubleshooting
Session expired
uvx upwork-mcp --login
Cloudflare CAPTCHA appears during tool calls
Run with a visible browser so you can solve it manually:
{
"mcpServers": {
"upwork": {
"command": "uvx",
"args": ["upwork-mcp", "--no-headless"]
}
}
}
Chrome not found
Install the bundled Chromium:
uvx patchright install chromium
"Not logged in" error
Your Upwork session expired. Re-run:
uvx upwork-mcp --login
Parallel tool call conflicts
The server serializes all tool calls internally โ no manual workaround needed. If you see race conditions, make sure you're on the latest version.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lead_upwork-0.2.0.tar.gz.
File metadata
- Download URL: lead_upwork-0.2.0.tar.gz
- Upload date:
- Size: 197.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f2f68cfef64ce7f283adcff8a5b46fc4e3f69c20a499ea148134647a5a0b0a45
|
|
| MD5 |
b7d8732634f392384855636e5fd2e7da
|
|
| BLAKE2b-256 |
b8f170e97a05c40200efa21b16a46a350b7a04cea797827140d5f9bc9b212117
|
File details
Details for the file lead_upwork-0.2.0-py3-none-any.whl.
File metadata
- Download URL: lead_upwork-0.2.0-py3-none-any.whl
- Upload date:
- Size: 33.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d68d65a7213667298556d40693a4c0d5fa556184887af1412c4a8ea623b5f8d1
|
|
| MD5 |
7dd64fdca5439d4b6944acccab943c6b
|
|
| BLAKE2b-256 |
235ca8d876b2a56df24869131258524b7c7cdbde44d7017efbceb335fadae0ec
|