Skip to main content
Glama

upwork-mcp

A Model Context Protocol (MCP) server that connects Claude to Upwork — enabling AI agents to search jobs, analyze opportunities, submit proposals, and manage client communications autonomously.

Works for any freelance niche: development, design, writing, marketing, automation, and more.


Features

Tool

Description

search_jobs

Search Upwork jobs by keyword, type, budget, experience level

get_job_details

Fetch full job description, screening questions, and client history

analyze_job

Score a job 0–100 across niche fit, client quality, budget, competition, and clarity

submit_proposal

Automatically write and submit a proposal with custom cover letter and bid

get_proposals

List submitted proposals and their current status

get_messages

Read conversations and check for unread messages

send_message

Reply to clients in ongoing conversations

get_profile

View your freelancer profile, JSS score, and connects balance

update_profile

Update your freelancer profile title, overview, and skills

manual_login

Capture session cookies from an already-logged-in Chrome tab


Related MCP server: offer-quest mcp

Architecture

Claude Agent
    │
    ▼
MCP Gateway (stdio, never restarts)
    │  HTTP POST /tool
    ▼
Worker Server (port 47821, hot-reloads on code changes)
    │
    ▼
CDP Proxy (port 9223, rewrites Host headers)
    │
    ▼
Chrome on host (port 9222, Playwright CDP connection)
    │
    ▼
Upwork Web UI

The gateway/worker split means you can update tool logic without restarting Claude or your MCP client.


Prerequisites

  • Node.js 20+

  • Docker + Docker Compose

  • Google Chrome installed

  • An Upwork freelancer account


Quick Start (Docker)

1. Clone and configure

git clone https://github.com/zcrossoverz/upwork-mcp.git
cd upwork-mcp
cp .env.example .env

Edit .env:

UPWORK_EMAIL=your@email.com
UPWORK_PASSWORD=yourpassword

FREELANCER_NAME=Your Name
FREELANCER_TITLE=Your Professional Title
FREELANCER_NICHE=your,skills,here

BID_RATE_DEFAULT=40
BID_RATE_MIN=25
BID_RATE_MAX=100

2. Start Chrome with CDP

connect-chrome-docker.bat

This launches Chrome with remote debugging + a CDP proxy that allows Docker to connect.

3. Start the worker

docker compose up -d

4. Capture your session

In Claude, call manual_login — it extracts cookies from your logged-in Chrome tab and saves the session. You only need to do this once (or after your session expires).


Connect to Claude Code

Add to your MCP config (~/.claude/claude_desktop_config.json):

{
  "mcpServers": {
    "upwork": {
      "command": "node",
      "args": ["/absolute/path/to/upwork-mcp/dist/gateway.js"],
      "env": {
        "WORKER_PORT": "47821"
      }
    }
  }
}

Or via CLI:

claude mcp add upwork node /absolute/path/to/upwork-mcp/dist/gateway.js

Local Development (Hot Reload)

npm install
npm run worker   # starts tsc --watch + nodemon on dist/worker.js

The gateway (dist/gateway.js) runs separately and proxies to the local worker — changes to any tool file reload the worker instantly without restarting Claude.


1. manual_login      → Capture session (first time / session expired)
2. get_profile       → Check connects balance before bidding
3. search_jobs       → Find relevant jobs by keyword
4. get_job_details   → Get full description + screening questions
5. analyze_job       → Score the opportunity (skip grade D or F)
6. submit_proposal   → Auto-bid with personalized cover letter
7. get_messages      → Check for client responses
8. send_message      → Reply to clients
9. get_proposals     → Track active proposals

Example agent prompt

Search for freelance jobs matching my skills posted in the last 3 days.
For each job with grade A or B:
1. Get full job details
2. Analyze the opportunity
3. Write a personalized proposal highlighting my relevant experience
4. Submit at the recommended bid rate

Job Analysis Scoring

The analyze_job tool scores each job across 5 dimensions:

Dimension

Max Points

What It Measures

Niche Fit

30

Keyword match between job and your FREELANCER_NICHE

Client Quality

25

Rating, total spend, hire rate, payment verified

Budget Fit

20

Budget vs your target rate, estimated project value

Competition

10

Number of existing proposals (fewer = better)

Project Clarity

10

Description detail, skills listed, budget specified

Red Flags

-5 each

Vague scope, low-budget signals, no client history

Grades:

Grade

Score

Action

A+

90–100

APPLY NOW — high priority

A

75–89

APPLY — strong opportunity

B

60–74

APPLY — worth pursuing

C

45–59

CONSIDER — marginal fit

D

30–44

SKIP

F

<30

AVOID


Project Structure

upwork-mcp/
├── src/
│   ├── gateway.ts                # MCP stdio gateway (thin proxy, never restarts)
│   ├── worker.ts                 # HTTP tool server (hot-reloads via nodemon)
│   ├── config.ts                 # Environment configuration
│   ├── browser/
│   │   ├── browser-manager.ts    # Playwright CDP connection manager
│   │   └── upwork-auth.ts        # Session management
│   └── tools/
│       ├── search-jobs.ts
│       ├── get-job-details.ts
│       ├── analyze-job.ts        # Scoring engine
│       ├── submit-proposal.ts
│       ├── get-proposals.ts
│       ├── get-messages.ts
│       ├── send-message.ts
│       ├── get-profile.ts
│       ├── update-profile.ts
│       └── manual-login.ts       # CDP cookie extractor
├── cdp-proxy.cjs                 # Host-side proxy: Docker → Chrome (fixes Host header)
├── connect-chrome-docker.bat     # Launch Chrome + CDP proxy (for Docker use)
├── connect-chrome.bat            # Launch Chrome only (for local use)
├── Dockerfile
├── docker-compose.yml
└── .env.example

Notes

Session Management

Login is handled manually via manual_login. Open Chrome, log in to Upwork normally (including any 2FA), then call manual_login — it captures all cookies and saves them for Playwright to reuse.

Bot Detection

Upwork may detect unusual activity. Use reasonable request intervals and do not run the agent continuously. The server connects to your real Chrome profile via CDP, which behaves more like a real browser than headless automation.

Selector Stability

Upwork's UI changes periodically. Browser-based selectors in src/tools/ may need updating if the UI is redesigned.

Ethical Use


License

MIT

Available Tools

11 tools
analyze_jobA

Analyze a job opportunity and score it across 5 dimensions to decide whether to apply.

Scoring breakdown (100 pts max):

  • Niche Fit (30pts): How well the job matches n8n/automation keywords

  • Client Quality (25pts): Rating, total spent, hire rate, location

  • Budget Fit (20pts): Budget vs your target rate, estimated total project value

  • Competition (10pts): Number of existing proposals (fewer = better)

  • Project Clarity (10pts): How well-defined the scope is

  • Red Flag Penalty (-5pts each): Vague scope, low budget signals, no client history

Returns: grade (A+/A/B/C/D/F), recommendation (APPLY NOW/APPLY/CONSIDER/SKIP/AVOID), suggested bid, estimated project value, key selling points, and proposal tips.

RECOMMENDED WORKFLOW:

  1. search_jobs → find candidates

  2. get_job_details → get full info

  3. analyze_job → score and decide

  4. submit_proposal → if grade A or B

ParametersJSON Schema
NameRequiredDescriptionDefault
jobYesFull job data object from get_job_details
my_rateNoYour target hourly rate in USD (defaults to BID_RATE_DEFAULT env var)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It details scoring dimensions, return values, and workflow. However, it does not explicitly state read-only nature or any side effects, but inference suggests no mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with bullet points and workflow, but somewhat lengthy. Every sentence adds value, though could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given nested input and no output schema, description covers scoring, output format, and workflow comprehensively. Could include example grades, but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage, but description adds meaning: job object should come from get_job_details, and my_rate defaults to env var. This enhances understanding beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool analyzes a job and scores it across 5 dimensions, with a specific scoring breakdown and return values (grade, recommendation, etc.). It distinguishes from siblings like get_job_details (raw details) and submit_proposal (acting on decision).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides a recommended workflow: use after get_job_details and before submit_proposal, and only for grades A or B. This guides when to use and when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_detailsA

Get full details of a specific Upwork job posting. Returns complete description, all screening questions, client history (jobs posted, hire rate, spend), required skills, budget, and proposal stats. ALWAYS call this before submitting a proposal to get screening questions and understand client context.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_urlYesFull Upwork job URL, e.g. https://www.upwork.com/jobs/~01234567890

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It describes return contents but does not disclose whether the operation is read-only, requires authentication, or has side effects. The description adds some behavioral context (what is returned) but lacks details on permissions or errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is three short lines: first line states purpose, second lists return items, third provides usage guideline. No redundant words, every sentence adds value, and it is front-loaded with the main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple retrieval tool with one parameter and no output schema, the description covers what, what returns, and when to use. It is mostly complete but could mention prerequisites (e.g., being logged in) or error conditions given sibling tools like 'manual_login' exist.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds no extra meaning beyond the schema's parameter description. The parameter is well-documented in the schema, so the description meets the baseline but does not enhance semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'Get' and resource 'full details of a specific Upwork job posting', listing specific return items. It distinguishes from sibling tools like 'get_messages' or 'get_profile' by focusing on job details and sets it apart as a prerequisite for proposal submission.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'ALWAYS call this before submitting a proposal', providing a clear when-to-use directive. However, it does not mention when not to use or compare directly with siblings like 'analyze_job', which might be an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_messagesA

Read Upwork messages.

  • Without room_id: lists all conversations with unread status and last message preview

  • With room_id: reads the full message history of that conversation

Use this to check for client responses, new invitations, and ongoing contract discussions.

ParametersJSON Schema
NameRequiredDescriptionDefault
room_idNoConversation room ID. Omit to list all conversations.
limitNoMax messages/conversations. Default: 20
unread_onlyNoOnly unread conversations. Default: false

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It accurately describes behavior: listing conversations vs. full history, and mentions unread status and last message preview. It does not contradict any annotations (none exist).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the main purpose. Every sentence adds value: first sentence states what it does, second explains the two modes, third gives usage guidance. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with 3 parameters and no output schema, the description is complete. It explains the two modes, parameter behavior, and provides context for when to use. No gaps are apparent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all parameters are described in the schema. The description adds value by explaining the behavioral implications of the room_id parameter (two modes). This goes beyond the schema's description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Read Upwork messages' and distinguishes two modes: without room_id to list conversations with unread status and last message preview, and with room_id to read full history. This specificity differentiates it from siblings like send_message or get_proposals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context: 'Use this to check for client responses, new invitations, and ongoing contract discussions.' While it doesn't list when not to use or alternatives, the context is clear and helpful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_profileA

Get your Upwork freelancer profile, stats, and connects balance. Returns: name, title, skills, hourly rate, JSS score, Top Rated status, total earnings, connects balance. Use this to understand your current standing and available connects before bidding.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_statsNoInclude earnings and connects balance (requires extra page loads). Default: true

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is adequate, stating it returns data. However, it does not disclose prerequisites (e.g., authentication via manual_login) or side effects (e.g., read-only). No annotations exist to supplement behavioral info.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states action and return list, second provides usage guidance. No redundant information, front-loaded with key purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

In the absence of an output schema, the description lists return fields, which is helpful. It explains the purpose and usage context. However, it does not cover error conditions or prerequisites, slightly reducing completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already describes the parameter. The tool description lists return fields (including those affected by the parameter) but does not add new meaning beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves the freelancer profile, stats, and connects balance, listing specific fields. This distinguishes it from siblings like update_profile (update) and submit_proposal (proposals).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage guidance: 'Use this to understand your current standing and available connects before bidding.' Implicitly suggests when to use (before bidding) but doesn't explicitly name alternatives or when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_proposalsA

Get list of your submitted proposals on Upwork. Shows status, bid rate, submission date, and whether the client is interviewing you. Use this to track which proposals need follow-up.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by status. Default: "active"
limitNoMax results. Default: 20

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior. It indicates a read operation, but lacks details on authentication, rate limiting, or data freshness. For a simple list tool, this is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences that are front-loaded with the core action and key details, with zero wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (list operation, two parameters, no output schema), the description adequately covers the returned fields and usage context. Minor missing details like output format do not detract significantly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and parameters are well-defined in the schema. The description adds no additional meaning beyond the schema, making a baseline score of 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves a list of submitted proposals on Upwork, specifies the fields returned (status, bid rate, submission date, interview indicator), and implicitly distinguishes from siblings like get_job_details, submit_proposal, and search_jobs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description suggests using this tool to track proposals needing follow-up, but does not explicitly state when not to use it or mention alternatives. Usage context is implied but not fully articulated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manual_loginA

Step 1: Open a visible browser window at Upwork login page. Returns immediately — you then login manually in the browser (solve CAPTCHA, enter credentials, handle 2FA). After login is complete, call save_session to persist the session.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description clearly states that it returns immediately and then requires manual user interaction. Discloses the key behavior without contradictions, though could mention if multiple calls create multiple windows.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences. No unnecessary words, every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema, the description is complete. It explains the workflow and references the next step (save_session), making it actionable for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has zero parameters, so description does not need to add parameter semantics. The description explains the tool's action adequately, achieving a baseline of 4 for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to open a browser window at the Upwork login page for manual login. It distinguishes itself from siblings like save_session by explaining the sequential flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs the agent to open the browser as Step 1 and then call save_session after manual login. Does not explicitly mention when not to use it, but the context of manual login for CAPTCHA/2FA is implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_sessionA

Step 2: After manually logging in via manual_login, call this to save the browser session. Checks if login was successful and saves cookies/storage for future headless use. Must be called AFTER you have fully logged in to Upwork in the browser window.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description discloses that it checks login success and saves cookies/storage, but does not detail failure handling or whether it overwrites. Adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences front-loaded with 'Step 2' and clear instructions. No extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, no output schema, and no annotations, the description covers prerequisites, purpose, and ordering. Lacks details on error handling but sufficient for simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in input schema (0 params, 100% coverage). Description adds value by explaining the tool's purpose without needing param details. Baseline 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'save the browser session' and specifies the resource (cookies/storage) and context (after manual login). It distinguishes from sibling manual_login by specifying it's step 2.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Must be called AFTER you have fully logged in' and positions it as step 2 after manual_login. Does not list alternatives but the workflow is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_jobsB

Search for jobs on Upwork. Optimized for n8n workflow automation niche. Returns a list of jobs with title, budget, description snippet, required skills, client info, and proposal count. Use this to find potential clients and opportunities.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch keywords. Examples: "n8n automation", "workflow integration n8n", "make.com zapier alternative", "api integration automation"
job_typeNoContract type. Default: "all"
experience_levelNoRequired experience level. Default: "all"
budget_minNoMinimum budget in USD
budget_maxNoMaximum budget in USD
posted_within_daysNoOnly jobs posted within N days. Default: 7
limitNoMax results. Default: 10

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description only mentions return fields but omits behavioral traits like authentication requirements, rate limits, pagination, or whether it is read-only. Agents need more context for safe invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Short two-sentence description that covers purpose and return info. Could be improved with structured formatting (e.g., bullet points) but no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with 7 parameters and no output schema, the description covers return fields but lacks details on sorting, pagination, error handling, or default behavior. Adequate but leaves gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% coverage with detailed parameter descriptions. Description does not add meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'Search' and resource 'jobs on Upwork'. Distinguishes from sibling tools like analyze_job and get_job_details by specifying it returns a list of jobs with specific fields. Optimized for a niche, which adds context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the tool is optimized for n8n workflow automation niche and suggests use to find clients, but lacks explicit guidance on when not to use or comparison to alternatives like get_job_details or analyze_job.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_messageA

Send a message in an Upwork conversation. Use this to:

  • Reply to client questions about your proposal

  • Follow up on submitted proposals (after 3-5 days)

  • Clarify project requirements

  • Communicate during an active contract

Keep messages professional, specific to the project, and value-adding.

ParametersJSON Schema
NameRequiredDescriptionDefault
room_idYesThe conversation room ID
messageYesMessage content to send

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must disclose behavioral traits. It mentions professionalism but lacks details on mutation, permissions, rate limits, or response behavior. Significant gap for a write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is a concise bullet list, front-loaded with purpose and use cases, no wasted words. Efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool is simple and description covers core usage, but lacks return value info (no output schema) and does not differentiate from siblings beyond purpose. Adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are documented. Description adds no extra meaning beyond 'room_id' and 'message'; could suggest format constraints but doesn't. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Send a message in an Upwork conversation' and lists specific use cases, distinguishing it from siblings like get_messages (read) and submit_proposal (different action).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use scenarios (reply, follow-up, clarify, communicate) but does not explicitly exclude other uses or compare to alternatives. Still clear and helpful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_proposalA

Submit a proposal/bid for an Upwork job. Before calling this:

  1. Call get_job_details to get screening questions

  2. Craft a personalized cover letter that:

    • Opens with the client's specific problem (not "I am an expert in...")

    • Shows concrete n8n examples relevant to their use case

    • Mentions specific workflow patterns (HTTP Request, Webhook, Code node, etc.)

    • Ends with a clear CTA

  3. Answer ALL screening questions thoughtfully

The agent will automatically type and submit the proposal.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_urlYesFull Upwork job URL
cover_letterYesFull proposal text (cover letter)
bid_rateNoHourly rate or fixed price in USD
screening_answersNoAnswers to screening questions in order (from get_job_details)
boost_bidNoUse extra Connects to boost proposal. Default: false

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It states the agent will automatically type and submit, but fails to mention if the operation is destructive, reversible, or requires authentication. Missing details on side effects or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with a clear opening sentence, bullet points for prerequisites, and no redundant text. Slightly verbose but justified by the need for instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters, no output schema, and no annotations, the description adequately explains preparation steps and parameter usage. However, it omits the return value (e.g., success/ failure) and error handling, leaving gaps for the agent to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions cover all 5 parameters clearly, and the description adds value by referencing get_job_details for screening_answers and explaining bid_rate format. This exceeds the baseline expectation for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool submits a proposal/bid for an Upwork job, a specific verb+resource pair. It distinguishes itself from siblings like get_job_details (retrieval) and get_proposals (viewing), making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit prerequisites and steps before calling, such as calling get_job_details and crafting a cover letter. However, it lacks statements on when not to use the tool or alternatives, though the context is strong enough to guide proper usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_profileA

Update your Upwork freelancer profile fields. Can update: title, description/bio, hourly_rate, skills. Each field is optional — only provide what you want to change. Uses the edit buttons on your profile page (requires browser via connect-chrome.bat).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoProfessional title shown on your profile
descriptionNoProfile overview/bio
hourly_rateNoHourly rate in USD
skillsNoSkills to add

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool uses edit buttons and requires a browser, which are important behavioral details for a mutation tool. It does not mention potential side effects, but the scope (optional fields) implies limited impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences, front-loaded with the action and resource, and no fluff. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations or output schema, the description adequately covers inputs and behavior. It mentions the prerequisite (browser) and optional nature of fields. It could mention what happens after update (e.g., confirmation), but not necessary for core understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description doesn't need to repeat details. However, it adds value by clarifying 'description/bio' as a mapping and specifying 'hourly_rate in USD', exceeding the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update your Upwork freelancer profile fields' and lists specific fields (title, description/bio, hourly_rate, skills). This distinguishes it from sibling tools like get_profile (read) and others.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states what fields can be updated, that each field is optional, and notes the prerequisite of using a browser via connect-chrome.bat. It provides clear context for when to use the tool, though it doesn't explicitly say when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 11 tool updatesv1.0.0
    • First observedanalyze_job
    • First observedget_job_details
    • First observedget_messages
    • First observedget_profile
    • First observedget_proposals
    • First observedmanual_login
    • First observedsave_session
    • First observedsearch_jobs
    • First observedsend_message
    • First observedsubmit_proposal
    • First observedupdate_profile

TDQS

A4.1/5.0
Disambiguation5/5

Each tool targets a distinct action and resource: job analysis, details retrieval, messaging, profile, proposals, login, search, sending messages, proposal submission, and profile updates. No two tools overlap in purpose.

Naming Consistency5/5

All tool names follow a clear verb_noun pattern with underscores (e.g., analyze_job, get_job_details, submit_proposal). The naming is uniform and predictable across the entire set.

Tool Count5/5

With 11 tools, the server is well-scoped for its purpose of automating Upwork freelancer operations. Each tool serves a necessary function without redundancy or unnecessary bloat.

Completeness4/5

The tool set covers the full workflow from job search to proposal submission, messaging, and profile management. A minor gap is the lack of tools for withdrawing proposals or managing contracts, but the core operations are complete.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that enables seamless interaction with LinkedIn for job applications, profile retrieval, feed browsing, and resume analysis through natural language commands.
    31
    -
  • A
    license
    B
    quality
    D
    maintenance
    A fast, secure, and LLM-friendly Model Context Protocol (MCP) server that scrapes job listings from major platforms (LinkedIn, Indeed, Google) and converts them into structured Markdown format.
    1
    1
    MIT
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP server for automating Upwork workflows including job search, proposal submission, client communication, and contract management. It provides tools for client vetting, template-based proposals, and session safety with audit logging.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/zcrossoverz/upwork-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server