Skip to main content

MCP server for Upwork via browser automation

Project description

Upwork MCP Server

PyPI Python License uv

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

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:

  1. Click the Cloudflare checkbox (if present)
  2. Enter your credentials
  3. 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 --login periodically 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

Apache 2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lead_upwork-0.2.0.tar.gz (197.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lead_upwork-0.2.0-py3-none-any.whl (33.4 kB view details)

Uploaded Python 3

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

Hashes for lead_upwork-0.2.0.tar.gz
Algorithm Hash digest
SHA256 f2f68cfef64ce7f283adcff8a5b46fc4e3f69c20a499ea148134647a5a0b0a45
MD5 b7d8732634f392384855636e5fd2e7da
BLAKE2b-256 b8f170e97a05c40200efa21b16a46a350b7a04cea797827140d5f9bc9b212117

See more details on using hashes here.

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

Hashes for lead_upwork-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d68d65a7213667298556d40693a4c0d5fa556184887af1412c4a8ea623b5f8d1
MD5 7dd64fdca5439d4b6944acccab943c6b
BLAKE2b-256 235ca8d876b2a56df24869131258524b7c7cdbde44d7017efbceb335fadae0ec

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page