← All posts

Upwork Jobs in Claude Code: MCP Setup in 2 Minutes

If you spend your working day in Claude Code or Cursor, the worst part of freelancing on Upwork is the context switch. You're deep in a problem, and finding your next contract means leaving the editor, opening a tab, scrolling a feed, and re-reading job posts you've already dismissed twice.

The Vibeworker MCP server removes that trip. Your ranked job feed becomes a set of tools your AI assistant can call directly — so instead of scrolling, you ask.

This post gets you connected in about two minutes and shows what's actually worth asking once you are.

Setup

There's nothing to install. It's a hosted MCP server, so you point your client at a URL and authenticate with your API key.

Sign up, then generate a key under Settings → Developer. It looks like vw_....

Claude Code:

claude mcp add vibeworker https://tryvibeworker.com/api/mcp \
  --header "Authorization: Bearer vw_your_api_key"

Cursor, Windsurf, or any other MCP client — add this to your MCP config:

{
  "mcpServers": {
    "vibeworker": {
      "url": "https://tryvibeworker.com/api/mcp",
      "headers": {
        "Authorization": "Bearer vw_your_api_key"
      }
    }
  }
}

That's it. Restart your client and the tools show up.

The first thing to ask

What Upwork jobs match my profile right now?

Claude calls list_jobs and comes back with something like:

1. [vw_b797267068b2] Build a Next.js dashboard with Supabase backend
   Fixed · $800 | Match: 91% | QuickWin: 8/10
   Web Development · https://www.upwork.com/jobs/~01abc...

2. [vw_2f10ac4491de] Fix broken Stripe webhook handler on a live store
   Fixed · $250 | Match: 88% | QuickWin: 9/10
   Web Development · https://www.upwork.com/jobs/~01def...

Two numbers there aren't in any raw job feed. Match is how well the job fits your profile, computed per-user. QuickWin is an LLM's read on whether the job is fixed-price, clearly bounded, and finishable in one session — the fastest path to a completed contract when you're building reviews.

If your profile isn't set up yet, say so and ask Claude to handle it. update_profile is one of the tools, so it can write your profile text and pick a scoring mode without you opening the dashboard.

Filtering in the prompt, not the UI

list_jobs takes real parameters, which means you can filter conversationally:

Show me fixed-price jobs over $500, sorted by quick win.

Behind that: jobType: "Fixed", minBudget: 500, sort: "quick_win". The full set is limit, sort (match, newest, budget, quick_win), jobType, minBudget, minScore, and categories.

minScore is the one people miss. It's your match score as a 0–1 float, so minScore: 0.8 means "only the top fifth of what you'd normally see." Useful when you want the shortlist rather than the feed.

For keyword hunting across recent postings, search_jobs searches titles and descriptions directly.

Where it stops being a feed reader

The reason to run this inside an AI assistant rather than a dashboard is that reading is only step one. Ask:

Draft a proposal for the Stripe one.

Claude calls get_proposal_context, which returns the full job description, the client's history, your profile, and a set of writing instructions in a single payload. Then it drafts — natively, with everything it needs already in context.

The instructions that come back are opinionated on purpose: under 200 words, lead with the client's problem rather than your credentials, reference concrete details from the brief, end with one question that proves you read it. That's the shape that actually gets replies.

What you get back is a draft and the Upwork URL. You read it, edit it, and submit it yourself. Vibeworker doesn't touch Upwork on your behalf and doesn't automate submission — that line matters, and it's on the right side of it.

A useful morning routine

The chained version is where this gets genuinely faster than the dashboard:

Check my feed, pick the three best fixed-price jobs under 10 hours
of estimated effort, and draft proposals for all of them.

That's list_jobsget_job three times → get_proposal_context three times, with judgment applied in between. You come back to three drafts and three URLs. Ten minutes of work, most of which is you editing rather than searching.

Worth adding to your CLAUDE.md if you do it daily:

## Upwork
When I ask about jobs, use the vibeworker MCP tools.
Prefer fixed-price work under 15 estimated hours.
Never draft a proposal without calling get_proposal_context first.
Always give me the Upwork URL with the draft.

Limits

Free accounts get 25 job results to try it with. After that, free access continues indefinitely but is limited to jobs older than 24 hours. Paid plans are unlimited and real-time.

That shape is deliberate rather than arbitrary. A job posting's value decays fast — proposals sent in the first hour get read, and by the time a post is a day old the client is already working a shortlist. So the free tier gives you the whole system, just not the window where it wins you contracts.

The configuration tools are the exception: create_filter, update_filter, update_profile and the rest are never rate-limited on any plan. Letting Claude set up your account costs nothing regardless of what you're paying.

Next

The configuration side is the half most people don't expect — the same connection that reads your feed can rebuild it. That's worth its own post.

If you'd rather build against plain HTTP than MCP, the API quickstart covers the same data from curl, Node, or Python.

Full MCP reference and tool list →


Michael Watkins

Michael Watkins

Founder of Vibeworker. Helping freelancers win the Upwork game through speed and data.

Stop missing the jobs that matter

Vibeworker watches the Upwork feed and alerts you the moment a high-fit job appears — before the proposals pile up.

Get started free →