Upwork MCP Server
Provides tools for searching jobs, managing proposals, messages, and contracts on Upwork via browser automation.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Upwork MCP Serversearch for Python developer jobs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Upwork MCP Server
MCP (Model Context Protocol) server for Upwork via browser automation. Enables Claude Code to search jobs, manage proposals, messages, and contracts on Upwork.
Features
Job Search: Search and filter Upwork jobs by keywords, budget, experience level, etc.
Job Details: Get comprehensive information about specific job postings
Profile: View your freelancer profile, connects balance, and stats
Proposals: View, submit, and withdraw proposals
Messages: Read and send messages in Upwork inbox
Contracts: View active and past contracts, work diary entries
Related MCP server: Upwork MCP Server
How It Works
This MCP uses Chrome DevTools Protocol (CDP) to connect to your real Chrome browser. This approach:
Bypasses Cloudflare's "automated test software" detection
Uses your real browser profile with history and cookies
Requires Chrome to be running with debug port enabled
Installation
Prerequisites
Python 3.12+
uv package manager
Google Chrome browser
Install from source
cd upwork-mcp
uv syncAuthentication
The server connects to Chrome via CDP (Chrome DevTools Protocol).
First-time setup
# Start login flow - opens Chrome with debug port
uv run upwork-mcp --loginThis will:
Start Chrome with
--remote-debugging-port=9222Navigate to Upwork login page
Wait for you to complete login (click Cloudflare checkbox, enter credentials)
Save session to
~/.upwork-mcp/chrome-profile/
Check session status
uv run upwork-mcp --checkClear session
uv run upwork-mcp --logoutUsage
With Claude Code (local development)
Add to your MCP settings (~/.config/claude-code/settings.json or workspace settings):
{
"mcpServers": {
"upwork": {
"command": "uv",
"args": ["--directory", "/path/to/upwork-mcp", "run", "upwork-mcp"]
}
}
}Available Tools
Tool | Description |
| Search for jobs matching criteria |
| Get detailed job information |
| Get your freelancer profile |
| Get current connects balance |
| Get earnings and work history stats |
| Get your submitted proposals |
| Get details of a specific proposal |
| Submit a proposal to a job |
| Withdraw a submitted proposal |
| Get inbox conversations |
| Get messages in a conversation |
| Send a message |
| Get unread message count |
| Get your contracts |
| Get contract details |
| Get work diary entries |
| Check if session is valid |
| Close browser and cleanup |
Examples
Search for Python developer jobs
Search for Python developer jobs on Upwork with budget over $1000Get job details
Get details for this Upwork job: https://www.upwork.com/jobs/~01234567890Check proposals
Show my active proposals on UpworkRead messages
Check my Upwork messagesCLI Options
upwork-mcp [OPTIONS]
Options:
--login Open browser for manual login
--check Check if session is valid
--logout Clear saved session
--no-headless Show browser window (debugging)
--timeout MS Page timeout in milliseconds (default: 30000)
--transport MCP transport type (default: stdio)Development
Project Structure
upwork-mcp/
├── pyproject.toml
├── README.md
├── src/upwork_mcp/
│ ├── __init__.py
│ ├── server.py # MCP server entry point
│ ├── browser/
│ │ ├── client.py # Patchright browser wrapper
│ │ └── auth.py # Login flow
│ ├── tools/
│ │ ├── jobs.py # Job search and details
│ │ ├── profile.py # Profile and connects
│ │ ├── proposals.py # Proposal management
│ │ ├── messages.py # Messaging
│ │ └── contracts.py # Contract management
│ └── utils/
│ ├── config.py # Configuration
│ └── logging.py # Logging setup
├── tests/
└── scripts/
└── test_all.pyRunning tests
uv run python scripts/test_all.pySession Storage
Session data is stored in ~/.upwork-mcp/profile/. This includes browser cookies and local storage that persist your Upwork login.
Troubleshooting
Session expired
# Re-authenticate
uvx upwork-mcp --loginCAPTCHA or Cloudflare challenge
Run with visible browser to solve manually:
uvx upwork-mcp --no-headlessBrowser not found
# Install Chromium for Patchright
uvx patchright install chromiumLicense
Apache 2.0
Available Tools
18 toolsupwork_check_sessionA
Check if the current Upwork session is valid.
Returns session status and whether re-login is needed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It correctly indicates a read-only check (returns status and re-login need) but does not disclose whether any side effects occur, such as token refresh or network calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The first sentence states the purpose, the second describes the output. Perfectly front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description covers the essential purpose and return value. It lacks potential details like error conditions or behavior when session is invalid, but remains adequate for a simple check tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters, the schema is trivially covered. The description adds meaning by explaining what the tool returns (session status and re-login need), providing value beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('check') and the resource ('current Upwork session'), specifying that it returns session status and re-login need. It is easily distinguishable from sibling tools like upwork_close_session which performs a different action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for verifying session validity before other actions but does not explicitly state when or when not to use it, nor does it mention alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_close_sessionA
Close browser session and cleanup resources.
Call this when you're done using Upwork tools to free up resources.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It states it will close the session and cleanup, which is the expected behavior. However, it does not disclose side effects like token invalidation or whether it's irreversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, no wasted words. Highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple close tool with no parameters or output schema, the description is mostly complete. It could mention that the action is irreversible, but overall it provides sufficient context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, and schema coverage is 100%. The description adds no further meaning, but the baseline for zero parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'close' and resource 'browser session and cleanup resources' are clear and specific. It distinguishes from sibling tools like 'upwork_check_session' which checks the session rather than closing it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call: 'when you're done using Upwork tools to free up resources.' While it doesn't list exclusions, the guidance is clear for a cleanup tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_connects_balanceA
Get current Upwork Connects balance.
Returns the number of available connects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It states 'Returns the number of available connects', which is adequate for a simple read operation, but lacks details on data freshness or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no wasted words. Action and result are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 a simple read operation, the description is complete. It could mention read-only nature, but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist (0 params), so baseline is 4. Description adds no parameter info, but none is needed since schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get current Upwork Connects balance' with the verb 'get' and resource 'connects balance'. It distinguishes itself from sibling tools by specifying the exact resource being accessed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives (e.g., other get tools). Lacks context on purpose (e.g., before submitting proposals) or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_contract_detailsA
Get detailed information about a specific contract.
Returns full contract details including milestones, hours logged, and feedback.
| Name | Required | Description | Default |
|---|---|---|---|
| contract_url | Yes | URL to the contract |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions return contents (milestones, hours, feedback) but does not disclose any side effects, permissions, or constraints (e.g., whether an active session is required, or if the contract must be owned by the user).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two concise sentences. The first states the purpose, the second lists example return details. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 required param, no output schema, no nested objects), the description adequately explains the tool's function and return contents. It could mention error handling or session requirements, but overall it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'contract_url' has full schema coverage (100%) with description 'URL to the contract.' The tool description does not add extra meaning beyond that; it simply reinforces that it's a URL. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Get detailed information about a specific contract,' using a specific verb and resource. It distinguishes itself from sibling tools like upwork_get_contracts (which likely lists contracts) by focusing on a single contract via URL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage ('when you need contract details') but provides no explicit guidelines on when to use this tool versus alternatives, nor any exclusions or prerequisites. It lacks sufficient guidance for an agent to distinguish from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_contractsB
Get your Upwork contracts.
Returns a list of contracts with client name, job title, status, and earnings.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results | |
| status | No | Filter by status: active, ended, or all | active |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It only states it returns a list, omitting details like default status filtering (active), pagination via limit, ordering, or authentication requirements. Minimal behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first states purpose, second lists output fields. No redundant information, front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (list with 2 params) and presence of an output schema, the description is nearly complete. It could mention pagination or default status, but the output schema covers return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have descriptions in the schema (coverage 100%). The tool description adds no extra meaning beyond the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get your Upwork contracts' and lists the returned fields (client name, job title, status, earnings). This distinguishes it from sibling tools like upwork_get_contract_details which likely returns a single contract's details, but it does not explicitly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., upwork_get_contract_details for a specific contract). The description does not specify prerequisites or context for use, leaving the agent without decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_conversationB
Get all messages in a specific conversation.
Returns conversation details with full message history.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum messages to return | |
| room_id | Yes | Chat room ID or URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool returns conversation details and full message history. However, it does not mention any side effects, such as marking messages as read, or any limitations like rate limits or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two front-loaded sentences. Every sentence adds value, and there is no unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks details about the return format, pagination, or how the 'limit' parameter interacts with the full message history. Given no output schema and a limit parameter, more context would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers both parameters with descriptions (limit and room_id), providing adequate meaning. The description does not add extra parameter details beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves all messages in a specific conversation and returns full message history. However, it does not distinguish itself from the sibling tool 'upwork_get_messages', which may have overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, such as 'upwork_get_messages'. There is no mention of prerequisites or context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_job_detailsB
Get detailed information about a specific Upwork job posting.
Returns comprehensive job details including description, client history, skills required, and application requirements.
| Name | Required | Description | Default |
|---|---|---|---|
| job_url | Yes | Full Upwork job URL or job ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It only states it returns details, lacking info on error behavior, rate limits, or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with main verb upfront. Concise and no filler, though could be more structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, the description adequately states purpose and output, but lacks output schema or examples.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter 'job_url' described in schema. The description adds no extra meaning beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves detailed info for a specific Upwork job, listing specifics like client history and skills. This distinguishes it from sibling tools like upwork_search_jobs which lists jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use or not use this tool vs siblings. The context of sibling names implies it's for detailed view after search, but no direct instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_messagesA
Get messages from Upwork inbox.
Returns a list of conversations with last message, sender info, and unread status.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum conversations to return | |
| room_id | No | Specific chat room ID or URL | |
| unread_only | No | Only show unread messages |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavioral traits. It omits whether the operation is read-only, any authentication requirements, rate limits, or pagination behavior. Only basic function is described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words; first sentence states purpose, second details output. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that 3 parameters are fully documented in schema and output schema exists, the description covers the main purpose and output. It lacks explanation of parameter interaction (e.g., room_id filtering) but is otherwise sufficient for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented. The description adds no additional parameter context beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Get messages from Upwork inbox' and specifies return includes 'list of conversations with last message, sender info, and unread status.' Distinguishes from siblings like upwork_get_conversation (full conversation detail) and upwork_get_unread_count (count only).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. Usage is implied by the purpose, but no direct comparison or exclusionary notes are given to aid selection among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_my_profileA
Get your Upwork freelancer profile information.
Returns profile data including name, title, hourly rate, JSS score, availability status, and skill tags.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description implies a read operation but does not disclose authentication requirements, potential errors, or side effects. For a simple read, it is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. Key information is front-loaded—purpose followed by data examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the zero-parameter, simple read nature, the description covers the essential aspects. It could mention error handling or authentication, but the core behavior and return data are well described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; schema coverage is 100%. The description adds value by listing returned fields, exceeding what the empty schema provides. Baseline for zero parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Get your Upwork freelancer profile information') and lists several data fields returned. It unambiguously identifies the resource and distinguishes from siblings like upwork_get_profile_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus siblings (e.g., upwork_get_profile_stats) or alternatives. The description merely states what it does without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_profile_statsB
Get profile statistics including earnings and work history.
Returns stats like total earnings, hours worked, jobs completed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description should carry full burden. It only lists returned data, but does not mention that it applies to the authenticated user, permissions required, or any side effects. For a getter, minimal transparency given lack of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: the first states the purpose, the second provides concrete examples. No wasted words, and the most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with no output schema, the description covers the main purpose and return values. It could explicitly state that it returns stats for the authenticated user's own profile, but overall it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. The description adds value by detailing the returned statistics (earnings, hours worked, jobs completed), which is meaning beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves profile statistics including earnings and work history, but does not differentiate from the sibling tool 'upwork_get_my_profile' which might return profile details. It is specific about the return values but lacks sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like 'upwork_get_my_profile' or 'upwork_get_contracts'. The description implies use for aggregate stats, but provides no exclusions or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_proposal_detailsA
Get detailed information about a specific proposal.
Returns details including cover letter, bid, and any messages.
| Name | Required | Description | Default |
|---|---|---|---|
| proposal_url | Yes | URL to the proposal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It accurately states it is a read operation returning details, but does not explicitly confirm no side effects or mention authentication requirements (common in Upwork tools).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences. The first sentence states the purpose, and the second lists key return fields. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers the main purpose and return content but could hint at the structure (e.g., if messages are paginated) or usage context (e.g., requires a valid proposal URL).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema coverage. The description adds no additional meaning beyond the schema's own description of 'URL to the proposal'. Schema already documents the parameter adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves detailed information about a specific proposal, listing included fields like cover letter, bid, and messages. It distinguishes from siblings like 'upwork_get_proposals' which likely returns a list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives such as 'upwork_get_proposals' or 'upwork_get_contract_details'. The context implies it is for a single proposal after obtaining its URL, but no exclusions or prerequisite steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_proposalsA
Get your submitted proposals on Upwork.
Returns a list of proposals with job title, status, bid amount, and dates.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results | |
| status | No | Filter by status: active, submitted, archived, or all | active |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It states the output format (list with specific fields), which is good. However, it doesn't disclose any behavioral traits like read-only nature, permission requirements, or clarify the meaning of the status parameter values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences. The first sentence states the purpose, and the second lists key return fields. No superfluous information, perfectly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema and the sibling tools, the description provides enough context for a list operation. It mentions the key fields returned. However, it could mention pagination or the effect of the limit parameter, though that is covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters described. The description adds context about the output fields but not about the parameters themselves. Baseline score of 3 is appropriate since the schema already documents the parameters adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get your submitted proposals on Upwork' with a specific verb and resource. It also mentions the return fields (job title, status, bid amount, dates), distinguishing it from sibling tools like upwork_get_proposal_details which focuses on a single proposal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description implies when to use this tool (to list proposals), it does not explicitly state when to use alternatives or mention exclusions. For example, it could note that for detailed info on a specific proposal, use upwork_get_proposal_details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_unread_countA
Get count of unread messages.
Returns total unread message count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that it returns a count, but does not mention that it is a read-only operation, authentication requirements, or performance characteristics. Since no annotations are provided, the description carries the full burden and leaves some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but contains slight redundancy: 'Get count...' and 'Returns total...' could be merged. It is not overly verbose, but could be more succinct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description clarifies the return value. However, it does not specify data type or error conditions, which would improve completeness for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema coverage is 100%. The description adds value by specifying the return value (total unread message count), which is helpful given no output schema. Baseline is 4 for no parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets the count of unread messages, which is specific and distinct from sibling tools like upwork_get_messages that retrieve actual messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a count is needed, but lacks explicit guidance on when not to use or alternatives (e.g., if message contents are needed, use upwork_get_messages).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_get_work_diaryA
Get work diary entries for a contract.
Returns work diary with daily hours and earnings.
| Name | Required | Description | Default |
|---|---|---|---|
| week_offset | No | 0 for current week, 1 for last week, etc. | |
| contract_url | Yes | URL to the contract |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully convey behavioral traits. It indicates a read operation ('Get') and mentions return data (daily hours and earnings) but does not disclose authentication needs, rate limits, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, with two short sentences that front-load the core purpose. There is no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description should compensate. It mentions returning daily hours and earnings, but lacks details on format, pagination, or any limits. For a simple data retrieval, it is adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already describes both parameters (contract_url and week_offset) with clear descriptions. The description adds no additional meaning beyond the schema, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get', the resource 'work diary entries', and the scope 'for a contract'. It specifies that it returns daily hours and earnings, which distinguishes it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (to retrieve work diary data) but provides no explicit guidance on when not to use it or alternatives. There is no mention of prerequisites or comparisons with siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_search_jobsA
Search for jobs on Upwork matching the specified criteria.
Returns a list of job summaries with title, budget, client info, and URL.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results | |
| query | Yes | Search keywords | |
| category | No | Job category filter | |
| job_type | No | Job type: hourly or fixed | |
| budget_max | No | Maximum budget in USD | |
| budget_min | No | Minimum budget in USD | |
| experience_level | No | Experience level: entry, intermediate, or expert |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions it returns a list of job summaries with specific fields, which is helpful. However, with no annotations, it does not disclose pagination, result limits, or ordering behavior, leaving gaps for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at two sentences (27 words), front-loaded with the purpose, and contains no unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given full schema coverage and an existing output schema, the description provides sufficient context for a straightforward search tool. It covers purpose and return fields, though it lacks explicit usage hints for parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so baseline is 3. The description adds no additional meaning beyond what the schema already provides, such as parameter relationships or usage hints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search for jobs on Upwork matching the specified criteria,' using a specific verb and resource. It distinguishes well from sibling tools like upwork_get_job_details, which retrieves details for a specific job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use for searching jobs but does not explicitly state when to use this tool versus alternatives. No guidance on exclusions or when not to use it is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_send_messageC
Send a message in an Upwork conversation.
Returns send status.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message content to send | |
| room_id | Yes | Chat room ID or URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. It mentions 'Returns send status' but lacks details on success/failure, side effects, or permissions. Minimal behavioral context for a destructive action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose. Efficient but could be better structured with more detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool (send message) with no output schema or annotations. Description minimally explains what it does and what it returns, but lacks error handling, format, or usage constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters described. Description adds no additional meaning beyond the schema, meeting the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Send a message in an Upwork conversation', specifying the action and resource. It distinguishes from sibling tools like upwork_get_messages (read) and upwork_submit_proposal (different action), though not explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use or when not to use, nor any prerequisites (e.g., need a valid room_id). Siblings exist for reading messages, but no context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_submit_proposalA
Submit a proposal to an Upwork job.
IMPORTANT: This is a sensitive action that will spend Connects. Make sure the cover letter and rate/bid are correct before submitting.
Returns submission status and connects used.
| Name | Required | Description | Default |
|---|---|---|---|
| bid | No | Bid amount (for fixed-price jobs) | |
| rate | No | Proposed hourly rate (for hourly jobs) | |
| answers | No | Answers to screening questions | |
| job_url | Yes | Full Upwork job URL | |
| cover_letter | Yes | Cover letter content |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden. It discloses the cost (spends Connects) and mentions return status and connects used, but omits details like irreversibility, side effects, or whether the proposal can be submitted multiple times for the same job. The warning is helpful but lacks full behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no fluff: action, warning, and return info. It is front-loaded and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters and no output schema, the description lacks details on return format specifics (e.g., keys), interaction between bid and rate for different job types, or error handling. It is minimally adequate but could provide more guidance for successful invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds no extra meaning beyond the schema; it only reinforces the need for correct values. No new parameter semantics are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Submit a proposal to an Upwork job', which is a specific verb+resource. It distinguishes from sibling tools like upwork_withdraw_proposal (withdraw) and upwork_get_proposals (read), 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly warns that this action spends Connects and advises to verify cover letter and rate/bid before submitting. However, it does not provide explicit when-not-to-use guidance or mention alternatives like checking connects balance first, but the context from siblings implies such checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upwork_withdraw_proposalB
Withdraw a submitted proposal.
Returns withdrawal status.
| Name | Required | Description | Default |
|---|---|---|---|
| proposal_url | Yes | URL to the proposal to withdraw |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Minimal disclosure: only mentions return of withdrawal status. No details on side effects, irreversibility, or conditions (e.g., time limits). With no annotations, the description should provide more behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise (two sentences), front-loaded with action. Slightly too terse but no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple tool with one parameter, but lacks details on the withdrawal status (e.g., format, possible values) and any error conditions. No output schema to supplement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with description. The tool description adds no extra meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Withdraw a submitted proposal' with a specific verb and resource. Distinguishes from siblings like submit_proposal and get_proposals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool, prerequisites (e.g., proposal must be in submitted state), or alternatives. Only a basic statement of action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Every tool targets a distinct resource and action: session management, profile, contracts, proposals, messages, jobs, and work diary. No two tools have overlapping purposes.
All tools follow the exact pattern 'upwork_verb_noun' in snake_case (e.g., upwork_get_connects_balance, upwork_submit_proposal), with verbs consistently lowercase.
18 tools cover the major facets of a freelancer's Upwork workflow (session, profile, jobs, proposals, contracts, messaging, work diary) without being overwhelming or sparse.
The set covers core retrieval and actions (search, submit, withdraw, message, view contracts/diary). Minor gaps exist, such as no update profile or manage offers, but the essential lifecycle is present.
Maintenance
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
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Provides cloud browser automation capabilities using Stagehand and Browserbase, enabling LLMs to i…
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables Claude to perform actions on X, LinkedIn, and Reddit via a Chrome extension, such as connecting with recruiters, finding threads, and replying to posts.36411MIT
- AlicenseAqualityFmaintenanceMCP server for Upwork via browser automation. Enables Claude Code to search jobs, manage proposals, messages, and contracts on Upwork.1864Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables Claude AI to interact with LinkedIn through browser automation, including profile reading, people and job search, company research, post publishing, and profile editing.MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with the Upwork freelance marketplace, including job search, proposal management, contract tracking, and earnings monitoring.1
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Arshiyan-Elahi/upwork-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server